Inno setup Inno安装程序:允许用户仅选择可安装软件的驱动器?

Inno setup Inno安装程序:允许用户仅选择可安装软件的驱动器?,inno-setup,Inno Setup,我是否允许用户仅选择安装软件的驱动器 例如,他们可以选择C或D驱动器: C:\软件 D:\软件 但是用户不能指定任何其他内容 就像他们不能选择在下载或MyDocumnets下安装软件…等等 这可能吗?如何限制用户仅选择安装软件的驱动器? 有数百种方法可以设计此限制。我选择了一个可以创建一个组合框,其中包含用户可以选择的可用路径。此代码首先列出机器上的所有固定驱动器,如果至少有一个,它将创建组合框,该组合框将取代原始的dir选择控件。它由驱动器名填充,后跟从指令值中获取的固定目录,该目录不得包含驱

我是否允许用户仅选择安装软件的驱动器

例如,他们可以选择C或D驱动器:

C:\软件

D:\软件

但是用户不能指定任何其他内容

就像他们不能选择在下载或MyDocumnets下安装软件…等等

这可能吗?

如何限制用户仅选择安装软件的驱动器? 有数百种方法可以设计此限制。我选择了一个可以创建一个组合框,其中包含用户可以选择的可用路径。此代码首先列出机器上的所有固定驱动器,如果至少有一个,它将创建组合框,该组合框将取代原始的dir选择控件。它由驱动器名填充,后跟从指令值中获取的固定目录,该目录不得包含驱动器部分,因为它已与找到的固定驱动器根连接:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName=My Program

[Messages]
SelectDirBrowseLabel=To continue, click Next.

[Code]
#ifdef UNICODE
  #define AW "W"
#else
  #define AW "A"
#endif
type
  TDriveType = (
    dtUnknown,
    dtNoRootDir,
    dtRemovable,
    dtFixed,
    dtRemote,
    dtCDROM,
    dtRAMDisk
  );
  TDriveTypes = set of TDriveType;

function GetDriveType(lpRootPathName: string): UINT;
  external 'GetDriveType{#AW}@kernel32.dll stdcall';
function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: string): DWORD;
  external 'GetLogicalDriveStrings{#AW}@kernel32.dll stdcall';

var
  DirCombo: TNewComboBox;

#ifndef UNICODE
function IntToDriveType(Value: UINT): TDriveType;
begin
  Result := dtUnknown;
  case Value of
    1: Result := dtNoRootDir;
    2: Result := dtRemovable;
    3: Result := dtFixed;
    4: Result := dtRemote;
    5: Result := dtCDROM;
    6: Result := dtRAMDisk;
  end;
end;
#endif

function GetLogicalDrives(Filter: TDriveTypes; Drives: TStrings): Integer;
var
  S: string;
  I: Integer;
  DriveRoot: string;
begin
  Result := 0;

  I := GetLogicalDriveStrings(0, #0);
  if I > 0 then
  begin
    SetLength(S, I);
    if GetLogicalDriveStrings(Length(S), S) > 0 then
    begin
      S := TrimRight(S) + #0;
      I := Pos(#0, S);
      while I > 0 do
      begin
        DriveRoot := Copy(S, 1, I - 1);
        #ifdef UNICODE
        if (Filter = []) or
          (TDriveType(GetDriveType(DriveRoot)) in Filter) then
        #else
        if (Filter = []) or
          (IntToDriveType(GetDriveType(DriveRoot)) in Filter) then
        #endif
        begin
          Drives.Add(DriveRoot);
        end;
        Delete(S, 1, I);
        I := Pos(#0, S);
      end;
      Result := Drives.Count;
    end;
  end;
end;

procedure DriveComboChange(Sender: TObject);
begin
  WizardForm.DirEdit.Text := DirCombo.Text;
end;

procedure InitializeWizard;
var
  I: Integer;
  StringList: TStringList;
begin
  StringList := TStringList.Create;
  try
    if GetLogicalDrives([dtFixed], StringList) > 0 then
    begin
      WizardForm.DirEdit.Visible := False;
      WizardForm.DirBrowseButton.Visible := False;

      DirCombo := TNewComboBox.Create(WizardForm);
      DirCombo.Parent := WizardForm.DirEdit.Parent;
      DirCombo.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top,
        WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width -
        WizardForm.DirEdit.Left, WizardForm.DirEdit.Height);
      DirCombo.Style := csDropDownList;
      DirCombo.OnChange := @DriveComboChange;

      for I := 0 to StringList.Count - 1 do
        DirCombo.Items.Add(StringList[I] + '{#SetupSetting('DefaultDirName')}');

      DirCombo.ItemIndex := 0;
      DirCombo.OnChange(nil);
    end;
  finally
    StringList.Free;
  end;
end;
和屏幕截图:


是的。用一些编码。但是仔细想想,验证目录编辑框并向用户显示错误消息(该位置无法使用)是否会让人感到舒服?使用组合框选择要安装的驱动器不是更好吗?请(如果可用)提供这些建议的链接?呃,对不起?我正在尝试获取有关如何限制用户选择您允许的文件夹以外的文件夹的更多信息。例如,您可以制作一个带有驱动器的组合框并隐藏原始编辑框,或者您可以让用户在单击“下一步”按钮时输入任何内容并检查文件夹是否允许,或者。。。?有无数种方法可以限制目录选择,我想问你如何设计你的目录?这需要更多的编码,它们只是允许他们选择主驱动器吗?不。但是你可以,例如,在下一步按钮上单击。或者,你可以直接。但是有很多很多不同的方法来设计您的限制…代码的其余部分如何知道选择了哪个驱动器文件夹?