Inno Setup Drive Selection Without Folder

编译时候不成功,跟踪了一下,发现是字符问题。
**************** Sample Code

* -- Sample Code for Inno 5.1.9
#define _AppDir_ "MyAppName"


[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={#_appdir_}
DefaultGroupName=My Program
Compression=lzma
SolidCompression=true
DisableProgramGroupPage=true
UsePreviousGroup=false
ShowLanguageDialog=no
OutputBaseFilename=drivesOnly
OutputDir=output


[Files]
Source: feature.txt; DestDir: {app}


[Dirs]
; Create Sub directories required
Name: {app}/backup
Name: {app}/temp
Name: {app}/tutorial
Name: {app}/images

[Messages]
SelectDirBrowseLabel=To continue, click Next. If you would like to select a different drive, choose from the list.

[Code]
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 'GetDriveTypeW@kernel32.dll stdcall';

function GetLogicalDriveStrings( nLenDrives: LongInt; lpDrives: String ): Integer;
external 'GetLogicalDriveStringsW@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('{#_AppDir_}'));
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 := false; // Edit box for folder don't have to be editable WizardForm.DirEdit.Enabled := false; // 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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值