如何将批处理中注册32/64位DLL的命令转为Inno Setup的[Run]段
正确的Inno Setup [Run]段写法
首先得理清Inno Setup里的位数相关常量和执行逻辑,你之前的写法主要问题在于引号转义不对,以及没有正确区分32/64位系统下的rundll32路径。以下是两种常见场景的正确写法:
场景1:32位安装程序(默认情况,兼容32/64位系统)
这是最通用的情况,能同时在32位和64位系统上完成对应DLL的注册:
[Run] ; 注册32位DLL:所有系统通用,{sys}在32位系统指向System32,在64位系统指向SysWOW64(32位系统目录) Filename: "{sys}\rundll32.exe"; Parameters: """{app}\my32.dll"",RegDll"; StatusMsg: "Registering 32-bit module..."; Flags: runhidden runascurrentuser ; 注册64位DLL:仅在64位系统执行,{sysnative}指向64位系统的System32目录(32位安装程序需用这个常量访问64位系统文件) Filename: "{sysnative}\rundll32.exe"; Parameters: """{app}\my64.dll"",RegDll"; StatusMsg: "Registering 64-bit module..."; Flags: runhidden runascurrentuser 64bit; Check: IsWin64
场景2:64位专属安装程序(仅在64位系统运行)
如果你已经设置了ArchitecturesInstallIn64BitMode=x64,让安装程序只在64位系统运行,写法可以简化:
[Run] ; 注册32位DLL:用SysWOW64目录下的32位rundll32 Filename: "{syswow64}\rundll32.exe"; Parameters: """{app}\my32.dll"",RegDll"; StatusMsg: "Registering 32-bit module..."; Flags: runhidden runascurrentuser ; 注册64位DLL:用System32目录下的64位rundll32 Filename: "{sys}\rundll32.exe"; Parameters: """{app}\my64.dll"",RegDll"; StatusMsg: "Registering 64-bit module..."; Flags: runhidden runascurrentuser
关键注意点:
- 引号转义:Inno Setup里需要用两个双引号
""来表示一个实际的双引号,所以参数里的路径要写成"""路径"""的格式,确保rundll32能正确识别带空格的路径。 - 常量区分:32位安装程序在64位系统中,
{sys}会被映射到32位系统目录(SysWOW64),如果要访问64位系统文件必须用{sysnative};64位安装程序则直接用{sys}指向64位系统目录,{syswow64}指向32位系统目录。 - 条件判断:注册64位DLL时,通过
Check: IsWin64确保只在64位系统执行,避免32位系统出现找不到文件的错误。
内容的提问来源于stack exchange,提问作者Joshua
相关产品推荐
相关产品推荐

