![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetVolumeInformation [D7, WinXP]
DNS © (2004-01-20 22:26:00)Вызываю
function GetVolumeInformation(lpRootPathName: PChar;
lpVolumeNameBuffer: PChar; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD;
var lpMaximumComponentLength, lpFileSystemFlags: DWORD;
lpFileSystemNameBuffer: PChar; nFileSystemNameSize: DWORD): BOOL;
И постоянно вызывает ошибку : SysErrorMessage(GetLastError) возвращает "Имеются дополнительные данные" %(
Подскажите что делать?
DNS (2004-01-21 22:39:00) [1]Паааасибочки, всё получилось.
YuRock (2004-01-21 14:05:00) [2]Ну так теперь все понятно! (извиняюсь за [2]).
Проблема в том, что Вы не указали размеры буферов, которые передаете в функцию, а так как они по умолчанию скорее-всего нули, а длина названия файловой системы больше нуля, то GetLastError и возвращает ошибку о недостатке памяти (в данном случае - для записи строки).
Т.е. для того, чтобы все заработало, надо перед вызовом функции GetVolumeInformation написать следующее:
nVolumeNameSize := 255;
nFileSystemNameSize := 255;
Счастливо!
MBo (2004-01-21 13:52:00) [3]Проходит без ошибок (Выдача Файловая система: FAT32)
Стоит добавить
lpRootPathName[3]:=#0;
DNS (2004-01-21 13:41:00) [4]Перед этим я устанавливаю
SetErrorMode(SEM_FAILCRITICALERRORS);
(правда после его закоментирования ошибка таже, только при отсутсвии диска ругаеться...)
Вообще код такой:
var
DisksList: TListBox; // Список дисков в системе
DiskInfList: TListBox; // Инфа о выбранном диске
//.....
procedure TMainF.DisksListClick(Sender: TObject); // юзер выбрал
//диск
var
i:Integer;
lpFileSystemNameBuffer,lpRootPathName, lpVolumeNameBuffer:array [0..255] of char;
nVolumeNameSize,lpMaximumComponentLength, lpFileSystemFlags,nFileSystemNameSize:dword;
lpVolumeSerialNumber:dword;
begin
if DisksList.Count > 0 then
for i:=0 to DisksList.Count-1 do
if DisksList.Selected[i] then
begin
DiskInfList.Items.BeginUpdate;
DiskInfList.Items.Clear;
lpRootPathName[0]:=DisksList.Items[i][1];
lpRootPathName[1]:=':';
lpRootPathName[2]:='\';
if GetVolumeInformation(lpRootPathName,
lpVolumeNameBuffer, nVolumeNameSize, @lpVolumeSerialNumber,
lpMaximumComponentLength, lpFileSystemFlags,
lpFileSystemNameBuffer, nFileSystemNameSize) then
begin
// Инфа о носителе
DiskInfList.Items.Add('Файловая система: '+ String(lpFileSystemNameBuffer));
{<<< И т.д. (метка, тип ...)>>>}
//.....
//.....
end
else
begin
DiskInfList.Items.Add(SysErrorMessage(GetLastError)); //Получаем сообщение об ошибке
end;
DiskInfList.Items.EndUpdate;
Break;
end;
end;
Почему постоянно ошибка - ума не приложу %(
Может быть кто нибудь уже сталкивался с такой ситуацией и знает что не так?
P.S. Ради интереса проверил на другой машине - тоже самое!
YuRock (2004-01-20 23:03:00) [5]17
Anatoly Podgoretsky (2004-01-20 22:58:00) [6]В приведом коде ошибки нет.