Inno setup Inno安装程序--看不到驱动器组合框
我想查看驱动器组合框,以便用户可以选择安装在哪个驱动器上 但是当我运行install时,我根本看不到组合框 也许有人能看到这个代码有什么问题?我从另一个网站复制了它,但是它没有显示驱动器组合框,因此我无法选择要安装的驱动器 这是我的密码:Inno setup Inno安装程序--看不到驱动器组合框,inno-setup,Inno Setup,我想查看驱动器组合框,以便用户可以选择安装在哪个驱动器上 但是当我运行install时,我根本看不到组合框 也许有人能看到这个代码有什么问题?我从另一个网站复制了它,但是它没有显示驱动器组合框,因此我无法选择要安装的驱动器 这是我的密码: var // combo box for drives cbDrive : TComboBox ; // array fo string that keep the drive letters DrvLetters: array of String; fun
var
// combo box for drives
cbDrive : TComboBox ;
// array fo string that keep the drive letters
DrvLetters: array of String;
function GetDriveType( lpDisk: String ): Integer;
external 'GetDriveTypeA@kernel32.dll stdcall';
function GetLogicalDriveStrings( nLenDrives: LongInt; lpDrives: String ): Integer;
external 'GetLogicalDriveStringsA@kernel32.dll stdcall';
const
DRIVE_UNKNOWN = 0; // The drive type cannot be determined.
DRIVE_NO_ROOT_DIR = 1; // The root path is invalid. For example, no volume is mounted at the path.
DRIVE_REMOVABLE = 2; // The disk can be removed from the drive.
DRIVE_FIXED = 3; // The disk cannot be removed from the drive.
DRIVE_REMOTE = 4; // The drive is a remote (network) drive.
DRIVE_CDROM = 5; // The drive is a CD-ROM drive.
DRIVE_RAMDISK = 6; // The drive is a RAM disk.
// function to convert disk type to string
function DriveTypeString( dtype: Integer ): String ;
begin
case dtype of
DRIVE_NO_ROOT_DIR : Result := 'Root path invalid';
DRIVE_REMOVABLE : Result := 'Removable';
DRIVE_FIXED : Result := 'Fixed';
DRIVE_REMOTE : Result := 'Network';
DRIVE_CDROM : Result := 'CD-ROM';
DRIVE_RAMDISK : Result := 'Ram disk';
else
Result := 'Unknown';
end;
end;
// change folder accordigly to the drive letter selected
procedure cbDriveOnClick(Sender: TObject);
begin
WizardForm.DirEdit.Text := DrvLetters[ cbDrive.ItemIndex ] + UpperCase(ExpandConstant('{#MyAppName}'));
end;
procedure FillCombo();
var
n: Integer;
drivesletters: String; lenletters: Integer;
drive: String;
disktype, posnull: Integer;
sd: String;
begin
//get the system drive
sd := UpperCase(ExpandConstant('{sd}'));
//get all drives letters of system
drivesletters := StringOfChar( ' ', 64 );
lenletters := GetLogicalDriveStrings( 63, drivesletters );
SetLength( drivesletters , lenletters );
drive := '';
n := 0;
while ( (Length(drivesletters) > 0) ) do
begin
posnull := Pos( #0, drivesletters );
if posnull > 0 then
begin
drive:= UpperCase( Copy( drivesletters, 1, posnull - 1 ) );
// get number type of disk
disktype := GetDriveType( drive );
// add it only if it is not a floppy
if ( not ( disktype = DRIVE_REMOVABLE ) ) then
begin
cbDrive.Items.Add( drive + ' [' + DriveTypeString( disktype ) + ']' )
SetArrayLength(DrvLetters, N+1);
DrvLetters[n] := drive;
// default select C: Drive
//if ( Copy(drive,1,2) = 'C:' ) then cbDrive.ItemIndex := n;
// or default to system drive
if ( Copy(drive,1,2) = sd ) then cbDrive.ItemIndex := n;
n := n + 1;
end
drivesletters := Copy( drivesletters, posnull+1, Length(drivesletters));
end
end;
cbDriveOnClick( cbDrive );
end;
procedure InitializeWizard();
begin
// create the combo box for drives
cbDrive:= TComboBox.Create(WizardForm.SelectDirPage);
with cbDrive do
begin
Parent := WizardForm.DirEdit.Parent;
Left := WizardForm.DirEdit.Left;
Top := WizardForm.DirEdit.Top + WizardForm.DirEdit.Height * 2;
Width := WizardForm.DirEdit.Width;
Style := csDropDownList;
end;
// hide the Browse button
WizardForm.DirBrowseButton.Visible := true;
// Edit box for folder don't have to be editable
WizardForm.DirEdit.Enabled := true;
// fill combo box with Drives
FillCombo;
// set the event on combo change
cbDrive.OnClick := @cbDriveOnClick ;
end;
procedure MyAfterInstall2(FileName: String);
begin
MsgBox('Just installed ' + FileName + ' as ' + CurrentFileName + '.', mbInformation, MB_OK);
end;
对我有用。至少在Inno Setup的Unicode版本中,一旦我通过以下方式使代码与Unicode版本兼容:
- 添加缺少的
代码>在<代码>结束之后<代码>在<代码>驱动程序注释之前:=复制(驱动程序注释,posnull+1,长度(驱动程序注释))代码>
- 使用Unicode版本的
和GetDriveType
,将GetLogicalDriveStrings
替换为A@
W@
我做了这些更改,但现在这一行出现了超出范围的运行时错误:WizardForm.DirEdit.Text:=DrvLetters[cbDrive.ItemIndex]+大写(ExpandConstant(“{MyAppName}”);在您的屏幕截图中,我看到了文本“我的程序应该安装在哪里?”我的代码中没有看到该文本。这是
SelectDirPage
的标准内容,您的代码在其中添加了组合框您是否使用Unicode版本的Inno安装程序?我不知道是否使用Unicode版本。我怎么知道呢?它应该在窗口标题中显示(a)或(u)。或者选中“关于”框。