Inno Setup:允许用户只选择可以安装软件的驱动器?

2024-05-09

我可以允许用户只选择要安装软件的驱动器吗?

例如,他们可以选择C or D drive:

C:\Software
D:\Software

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

就像他们不能选择安装下面的软件一样Downloads or MyDocumnets … etc.

这可能吗?


如何限制用户只选择要安装软件的驱动器?

有数百种方法可以设计此限制。我选择了一个创建一个组合框的组合框,其中包含用户可以选择的可用路径。该代码首先列出了机器上的所有固定驱动器,如果至少有一个,它会创建组合框,而不是原始的目录选择控件。它填充了驱动器名称,后跟从驱动器中获取的固定目录DefaultDirName http://jrsoftware.org/ishelp/topic_setup_defaultdirname.htm指令值不得包含驱动器部分,因为它已经与找到的固定驱动器根连接:

[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;

以及截图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Inno Setup:允许用户只选择可以安装软件的驱动器? 的相关文章

随机推荐

  • 带有添加新选项卡按钮 (+) 的 TabControl

    在 WPF 中选项卡控件的选项卡条中的所有选项卡项的末尾添加 按钮选项卡的正确方法是什么 它应该可以正确地处理多个选项卡标题行 它应该位于所有选项卡项目的末尾 Tab cycling should work correctly Alt Ta
  • 如何将文件中的值分配给 UNIX sh shell 中的变量?

    我一直在搜索这个网站 试图找到这个问题的答案 并发现了几个非常好的答案 不幸的是 它们都不适合我 这是我正在使用的脚本 VALUE cat szpfxct tmp export VALUE echo gt gt LGFILE echo te
  • 如何在 python 中创建“空 if 语句”

    这在 C 语言中很常见 像这样破解 空 if 语句 if mostlyhappencondition empty statement else dosomething 它在 Python 中工作吗 我的意思是 我们可以通过使用它来提高应用程
  • 从 Eclipse 在 AWS-EMR 上运行 MapReduce 作业

    我在 Eclipse 中有 WordCount MapReduce 示例 我将其导出到 Jar 然后将其复制到 S3 然后我在 AWS EMR 上运行它 成功地 然后 我读到了这篇文章 http docs aws amazon com El
  • 定制导轨配置部分

    为 Rails 应用程序创建自定义配置部分的最佳方法是什么 理想情况下 我希望最终结果是一个 api 调用 例如 Rails configuration foo bar Rails configuration foo baz e g Rai
  • Parse.com 因超出突发限制而拒绝服务

    我使用 Parse 创建了一个 iOS 应用程序 其中使用的是从 Parse com 网站下载的 iOS SDK 为了创建此类应用程序 ApplicationID 和 ClientID 密钥都嵌入在 iOS 应用程序中 并在使用应用程序时从
  • 使用 AngularJS 将图像上传到 Firebase

    我有一个处理 剧集 的服务 创建 删除和更新它们 它看起来像这样 app service Episode firebase FIREBASE URL function firebase FIREBASE URL var ref new Fi
  • 使用动画更改 UIView 背景颜色

    我想改变我的UIView带有过渡动画的背景颜色 例如 如果视图是红色的 我将其更改为蓝色 蓝色将从屏幕底部向上滑动到顶部并充满整个屏幕 我想通过制作一个来做到这一点UIView具有相同大小和所需颜色 然后将其从屏幕外一直动画到顶部 但这似乎
  • 在 JavaScript 中嵌套“switch”案例:有速度优势吗?

    这里有新手问题 我有一个包含大量字符串的 开关 像这样按字母顺序拆分是否有速度优势 switch myString substring 0 1 case a switch myString case a string beginning w
  • 我应该如何在使用实例属性和类属性之间进行选择?

    我尝试了这个示例代码 class testclass classvar its classvariable LITERAL def init self x y self z x self classvar its initvariable
  • 如何在 Flutter 中为 Button 添加渐变?

    有没有办法改变ElevatedButton背景颜色渐变 如果没有一些小瑕疵或问题 例如缺少涟漪效应 不需要的边框 不尊重主题的内容 上述所有解决方案都无法真正发挥作用minWidth对于按钮 The 下面的解决方案没有上述问题 关键部分是使
  • 关于指针对齐的问题

    我正在研究内存池实现 我对指针对齐有点困惑 假设我有一个分配固定大小内存块的内存池 在创建内存池时我使用 malloc size num of block 如果分配的是对象 并且大小来自 sizeof 运算符对齐 则不必担心 但如果大小不均
  • 如何使用python检查任务管理器中某个进程是否正在运行

    我在 python 中有一个函数 当任务管理器中出现某个进程 例如 proc exe 时 该函数应该开始运行 如何使用 python 监控任务管理器中运行的进程 这是我改编的东西微软 http www microsoft com techn
  • 通过 cocoa pods 创建的 .xcworkspace 中的 .xcodeproj 文件被禁用

    我浏览互联网没有找到答案 所以这就是问题所在 我有一个项目 我在其中使用了 cocoa pods 因此通过 cocoa pods 为我创建的工作区文件打开它 但是在将我的操作系统 全新安装 更新到 MacOS Sierra 后 当我在 xc
  • Haskell Cabal 包 - 找不到 Paths_ 模块

    我正在开发一个 Haskell 项目 Happstack 服务器 Blaze HTML 前端作为主要库 我想添加一个静态数据目录 看起来你可以使用 Cabal 使用自动生成的Path
  • 在 django Rest 框架中实现角色

    我正在构建一个 API 应该拥有以下类型的用户 super user 创建 管理管理员 admin 管理事件 模型 和事件参与者 participants 参加活动 受管理员邀请参加活动 另外我想让每种类型的用户都有电话号码字段 I tri
  • 有没有办法设置一个变量一次并在多个地方使用它而不给它模块级别的范围?

    我有一个循环将用户窗体控件添加到集合中 由于多个地方都需要该集合 因此我将其放入模块中并在需要时调用它 这意味着该集合仅在需要时才位于内存中 但这也意味着我每次想要使用它时都会运行一个循环 I could已给出集合模块级别范围并在第一次需要
  • 类型“Promise”上不存在属性“finally”

    我试图对承诺使用finally 方法 但我不断收到此错误 Property finally does not exist on type Promise
  • 向 TextField 添加提示

    我想添加一个TextField带有集成的提示文本 用户提示 占位符 直到用户输入文本 当 TextField 获得焦点时 提示文本会消失 如果 TextField 失去焦点且未输入任何文本 则提示文本会重新出现 我最初认为这将是 Vaadi
  • Inno Setup:允许用户只选择可以安装软件的驱动器?

    我可以允许用户只选择要安装软件的驱动器吗 例如 他们可以选择C or D drive C Software D Software 但用户不能指定任何其他内容 就像他们不能选择安装下面的软件一样Downloads or MyDocumnets