OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 15 Июнь, 2025 03:29

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: Четверг, 05 Сентябрь, 2024 17:19 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 95
Доброго времени суток. Я использую 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?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 06 Сентябрь, 2024 13:17 

Зарегистрирован: Воскресенье, 06 Август, 2017 19:33
Сообщения: 95
Разобрался:

Код:
PROCEDURE Start*;
CONST
   nVolumeNameSize = WinApi.MAX_PATH;
   nFileSystemNameSize = WinApi.MAX_PATH;
VAR
   b: WinApi.BOOL;
   volumeNameBuffer, lpFileSystemNameBuffer: WinApi.PtrWSTR;
   str1: ARRAY nVolumeNameSize OF CHAR;
   str2: ARRAY nFileSystemNameSize OF CHAR;
   lpVolumeSerialNumber, lpMaximumComponentLength, i, contentLock, contentSize, size: INTEGER;
   lpFileSystemFlags: SET;
   p, p2: WinApi.PtrVoid;
   long, l2, l3: LONGINT;
BEGIN
   p := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, nVolumeNameSize);
   SYSTEM.PUT (SYSTEM.ADR (volumeNameBuffer), p);
   p2 := WinApi.HeapAlloc (WinApi.GetProcessHeap(), {}, nFileSystemNameSize);
   SYSTEM.PUT (SYSTEM.ADR (lpFileSystemNameBuffer), p2);
   
   b := WinApi.GetVolumeInformationW ("F:\", volumeNameBuffer, nVolumeNameSize, lpVolumeSerialNumber, lpMaximumComponentLength, lpFileSystemFlags, lpFileSystemNameBuffer, nFileSystemNameSize);
   IF b # 0 THEN         
      IF volumeNameBuffer # NIL THEN
         FOR i := 0 TO LEN (str1) - 1 DO
            str1[i] := volumeNameBuffer[i];
         END;
         str1[i - 1] := 0X;
      END;
      StdLog.String ("Имя тома: "); StdLog.String (str1); StdLog.Ln;
      
      IF lpFileSystemNameBuffer # NIL THEN
         FOR i := 0 TO LEN (str2) - 1 DO
            str2[i] := lpFileSystemNameBuffer[i];
         END;
         str2[i - 1] := 0X;
      END;
      StdLog.String ("Имя файловой системы: "); StdLog.String (str2); StdLog.Ln;
      
      long := ABS (LONG (MIN (INTEGER))) + 1;
      l2 := ABS (lpVolumeSerialNumber);
      l3 := MAX(INTEGER);
      long := long - l2 + l3;
      
      StdLog.String ("Серийный номер:"); StdLog.Int (lpVolumeSerialNumber); StdLog.String (" т.е. "); StdLog.Int (long); StdLog.Ln;
      StdLog.String ("Максимальная длина файла:"); StdLog.Int (lpMaximumComponentLength); StdLog.Ln;
      StdLog.String ("Опции файловой системы: "); StdLog.Set (lpFileSystemFlags); StdLog.Ln;   
   ELSE
      StdLog.String ("Ошибка"); StdLog.Ln
   END
END Start;


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB