简体   繁体   中英

How to get volume name from GetVolumeInformation in Inno Setup?

I try to get the volume name in Inno Setup from Windows API. The serial number is returned correctly but the volume name is empty. I used the code of 'kobik' in this thread:

How can I use GetVolumeInformation in Inno Setup?

This is my function in Inno Setup:

function FindVolumeName(const Drive: string): string;
var
  FileSystemFlags: DWORD;
  VolumeSerialNumber: DWORD;
  MaximumComponentLength: DWORD;
  ErrorCode: integer;
  VolumeLabel: PChar;

begin
  Result := '';

  { Note on passing PChars using RemObjects Pascal Script: }
  { '' pass a nil PChar }
  { #0 pass an empty PChar }
  if (GetVolumeInformation(pchar(drive), volumeLabel, MAX_LENGTH, VolumeSerialNumber, MaximumComponentLength, FileSystemFlags, '', 0)) then
  begin
    Result := WordToHex(HiWord(VolumeSerialNumber)) + '-' + WordToHex(LoWord(VolumeSerialNumber));
  end
  else
  begin
    errorCode:= GetLastError();
    MsgBox (SysErrorMessage (errorCode), mbError, MB_OK);
  end;

  MsgBox('VolumeLabel: ' +volumeLabel, mbInformation, MB_OK);
end;

I'm not sure how to use the PChar type.

function GetVolumeInformation(
  lpRootPathName: string; lpVolumeNameBuffer: string; nVolumeNameSize: DWORD;
  var lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength: DWORD;
  var lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: string;
  nFileSystemNameSize: DWORD): BOOL;
  external 'GetVolumeInformationW@kernel32.dll stdcall';

const
  MAX_PATH = 260;

function FindVolumeName(const Drive: string): string;
var
  FileSystemFlags: DWORD;
  VolumeSerialNumber: DWORD;
  MaximumComponentLength: DWORD;
begin
  SetLength(Result, MAX_PATH)
  if GetVolumeInformation(
       Drive, Result, Length(Result), VolumeSerialNumber, MaximumComponentLength,
       FileSystemFlags, '', 0) then
  begin
    SetLength(Result, Pos(#0, Result) - 1);
  end
    else
  begin
    RaiseException(SysErrorMessage(DLLGetLastError()));
  end
end;

(The code is for Unicode version of Inno Setup – The only version as of Inno Setup 6).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM