Доброго времени суток. Я использую WinApi.GetVolumeInformation:
Код:
PROCEDURE Start*;
CONST
nVolumeNameSize = 256;
nFileSystemNameSize = 256;
TYPE
Str = ARRAY 100 OF SHORTCHAR;
VAR
b: WinApi.BOOL;
volumeNameBuffer, lpFileSystemNameBuffer: WinApi.PtrSTR;
str: Str;
lpVolumeSerialNumber, lpMaximumComponentLength, i, contentLock, contentSize, size: INTEGER;
lpFileSystemFlags: SET;
BEGIN
b := WinApi.GetVolumeInformation ("F:\", volumeNameBuffer, SIZE (SHORTCHAR) * nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
IF b # 0 THEN
IF volumeNameBuffer # NIL THEN
StdLog.String ("Имя буфера: ");
FOR i := 0 TO nVolumeNameSize - 1 DO
StdLog.Char (volumeNameBuffer[i]);
END;
StdLog.Ln;
END;
IF lpFileSystemNameBuffer # NIL THEN
StdLog.String ("Имя файловой системы: ");
FOR i := 0 TO nFileSystemNameSize - 1 DO
StdLog.Char (volumeNameBuffer[i]);
END;
StdLog.Ln;
END;
StdLog.Ln;
StdLog.String ("Серийный номер:"); StdLog.Int (lpVolumeSerialNumber); StdLog.Ln;
StdLog.String ("Максимальная длина файла:"); StdLog.Int (lpMaximumComponentLength); StdLog.Ln;
StdLog.String ("Опции файловой системы: "); StdLog.Set (lpFileSystemFlags); StdLog.Ln;
ELSE
StdLog.String ("Ошибка"); StdLog.Ln
END
END Start;
END Knysh_keeperDiskSerialNumber.
Но переменные volumeNameBuffer и lpFileSystemNameBuffer имеют значение NIL. Хорошо, пробую так:
Код:
p, p2: WinApi.PtrVoid;
BEGIN
p := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, SIZE (SHORTCHAR) * nVolumeNameSize);
SYSTEM.PUT (SYSTEM.ADR (volumeNameBuffer), p);
p2 := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, SIZE (SHORTCHAR) * nFileSystemNameSize);
SYSTEM.PUT (SYSTEM.ADR (lpFileSystemNameBuffer), p2);[/b]
b := WinApi.GetVolumeInformation ("F:\", volumeNameBuffer, SIZE (SHORTCHAR) * nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
Теперь эти переменные выдают какой-то мусор. Что я делаю не так? Может в новых версиях BB есть какой-то более корректный способ работы с дисками, например посредством модуля Files?