[Setup]
AppName=Example
AppVerName=Example 1.0
DefaultDirName={pf}\Example
OutputDir=.
[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
DRIVE_NO_ROOT_DIR = 1;
DRIVE_FIXED = 3;
var
cbDrive: TComboBox;
function GetLogicalDrives: DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: string): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
procedure cbDriveOnClick(Sender: TObject);
var
DirValue: string;
begin
DirValue := WizardDirValue;
StringChangeEx(DirValue, AddBackslash(ExtractFileDrive(DirValue)), cbDrive.Items[cbDrive.ItemIndex], True);
WizardForm.DirEdit.Text := DirValue;
end;
procedure DirEditOnChange(Sender: TObject);
var
i: Integer;
begin
for i := 0 to cbDrive.Items.Count - 1 do
begin
if CompareText(cbDrive.Items[i], AddBackslash(ExtractFileDrive(WizardDirValue))) = 0 then
begin
cbDrive.ItemIndex := i;
Break;
end;
end;
end;
procedure FillCombo;
var
dwDrives: DWORD;
uDriveType: UINT;
szDriveLetter: string;
i: Integer;
begin
dwDrives := GetLogicalDrives;
for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
begin
szDriveLetter := Chr(Ord('A') + i) + ':\';
uDriveType := GetDriveType(szDriveLetter);
case uDriveType of
DRIVE_FIXED:
begin
cbDrive.Items.Add(szDriveLetter);
if CompareText(cbDrive.Items[cbDrive.Items.Count - 1], AddBackslash(ExtractFileDrive(WizardDirValue))) = 0 then
cbDrive.ItemIndex := cbDrive.Items.Count - 1;
end;
DRIVE_NO_ROOT_DIR: Continue;
end;
end;
end;
procedure InitializeWizard;
begin
WizardForm.DirEdit.Left:= WizardForm.DirEdit.Left + ScaleX(50);
WizardForm.DirEdit.Width:= WizardForm.DirEdit.Width - ScaleX(50);
WizardForm.DirEdit.OnChange := @DirEditOnChange;
cbDrive := TComboBox.Create(WizardForm.SelectDirPage);
with cbDrive do
begin
Parent := WizardForm.DirEdit.Parent;
Top := WizardForm.DirEdit.Top;
Width := ScaleX(40);
Height := WizardForm.DirEdit.Height;
Style := csDropDownList;
OnClick := @cbDriveOnClick;
FillCombo;
end;
end;