Inno设置 - 无法看到驱动器组合框

时间:2017-08-28 22:49:25

标签: inno-setup

我想看看驱动器组合框,以便用户可以选择要安装的驱动器。

但是当我运行安装时,我根本看不到组合框?

也许有人可以看到这段代码有什么问题?我从其他网站复制了它,但它没有显示驱动器组合框,因此我无法选择要安装的驱动器。

这是我的代码:

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;

1 个答案:

答案 0 :(得分:0)

适合我。至少在Inno Setup的Unicode版本中,一旦我通过以下方式使代码与Unicode版本兼容:

  • ;
  • 之前end之后添加缺失的drivesletters := Copy( drivesletters, posnull+1, Length(drivesletters));
  • 使用GetDriveTypeGetLogicalDriveStrings的Unicode版本,将A@替换为W@

enter image description here