Como el InnoSetup
no es compatible con los punteros, deberá crear la biblioteca externa para la llamada de la función GetVolumeInformation
. Los siguientes ejemplos de código deberían funcionar para todas las combinaciones de Delphi e InnoSetup (desde el punto de vista de soporte Unicode).
Aquí está el código de la biblioteca 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.
Y aquí está el código InnoSetup: Código
[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;
Gracias una y otra vez. Perdóname por ser un idiota, pero ¿cómo interpreto eso? Por ejemplo, mi unidad C está etiquetada como 449D-0C30 en el símbolo del sistema, pero cuando ejecuto su código Inno el msgbox muestra 17565-3120. Sé que estoy en el camino correcto, pero soy nuevo en la importación de funciones en Inno! ¡Muchas gracias por tu ayuda! – user1208402
17565-3120 en decimal hexadecimal es 449D-0C30. ver mi edición – kobik
He tenido varias personas que prestan sólidos consejos. Soy nuevo en la pila, entonces, ¿cómo puedo darles crédito por sus contribuciones? – user1208402