Poiché lo InnoSetup
non supporta i puntatori, è necessario creare la libreria esterna per la chiamata della funzione GetVolumeInformation
. I seguenti esempi di codice dovrebbero funzionare per tutte le combinazioni di Delphi e InnoSetup (dal punto di vista del supporto Unicode).
Ecco il codice della libreria Delphi:
library VolumeInformation;
uses
Types, Classes, SysUtils, Windows;
var
SerialNumber: AnsiString;
function GetVolumeSerial(Drive: PAnsiChar): PAnsiChar; stdcall;
var
FileSystemFlags: DWORD;
VolumeSerialNumber: DWORD;
MaximumComponentLength: DWORD;
begin
SerialNumber := '';
GetVolumeInformationA(Drive, nil, 0, @VolumeSerialNumber,
MaximumComponentLength, FileSystemFlags, nil, 0);
SerialNumber := IntToHex(HiWord(VolumeSerialNumber), 4) + ' - ' +
IntToHex(LoWord(VolumeSerialNumber), 4);
Result := PAnsiChar(SerialNumber);
end;
exports
GetVolumeSerial;
end.
Ed ecco il codice InnoSetup: Codice
[Files]
Source: "VolumeInformation.dll"; Flags: dontcopy
[Code]
function GetVolumeSerial(Drive: PAnsiChar): PAnsiChar;
external '[email protected]:VolumeInformation.dll stdcall setuponly';
procedure ButtonOnClick(Sender: TObject);
var
S: string;
begin
S := GetVolumeSerial('c:\');
MsgBox(S, mbInformation, mb_Ok);
end;
Grazie ancora e ancora. Perdonami per essere un idiota, ma come lo interpreto? Ad esempio, il mio C drive è etichettato come 449D-0C30 al prompt dei comandi, ma quando eseguo il codice Inno il msgbox mostra 17565-3120. So di essere sulla strada giusta, ma sono nuovo nell'importare funzioni in Inno! Grazie mille per il vostro aiuto! – user1208402
17565-3120 in decimale esadecimale è 449D-0C30. vedi la mia modifica. – kobik
Ho avuto molte persone che danno un solido consiglio. Sono nuovo lo stack, quindi come posso dare loro credito per i loro contributi? – user1208402