Inno Setup 6.5.1中无法导入ExecDos.dll的问题求助
问题排查与解决步骤
1. 修正文件名拼写错误
错误提示中找不到的是ExecDoc.dll,但你的代码里引用的是ExecDos.dll,同时[Files]段里写的是ExeDos.dll(少了一个c),拼写不一致是核心问题之一:
- 确认本地DLL文件的实际文件名是
ExecDos.dll - 同步
[Files]段和[Code]段的文件名:
[Files] Source: "ExecDos.dll"; DestDir: "{tmp}"; Flags: dontcopy
// Import ExecDos from DLL procedure ExecDos(const CmdLine: String; const OutputCallback: LongWord); external 'ExecDos@files:ExecDos.dll stdcall';
2. 匹配DLL与Inno Setup的架构/编码
ExecDos分ANSI/Unicode、x86/x64版本,必须和你的Inno Setup编译版本完全对应:
- 若使用Unicode版Inno Setup,选用
Unicode x86或Unicode x64版DLL(x64版仅适用于64位安装包) - 若使用ANSI版Inno Setup,对应使用ANSI版DLL
- 禁止混用不同架构/编码的DLL,否则必然导入失败
3. 调整回调函数参数类型(Unicode兼容)
如果是Unicode版Inno Setup,ExecDos传递的输出字符串为宽字符,原回调函数的PAnsiChar参数会导致乱码或调用失败,需改为PWideChar:
procedure AddLine(S: PWideChar); begin OutputMemo.Lines.Add(S); OutputMemo.SelStart := Length(OutputMemo.Text); // auto-scroll end;
4. 修正函数调用约定
NSIS插件通常使用cdecl调用约定,而非你代码里的stdcall,修改导入语句的调用约定:
procedure ExecDos(const CmdLine: String; const OutputCallback: LongWord); external 'ExecDos@files:ExecDos.dll cdecl';
5. 验证DLL本身的可用性
用Dependency Walker工具检查ExecDos.dll是否存在缺失的依赖库,同时确保DLL文件未损坏、权限正常,可正常被系统加载。
内容的提问来源于stack exchange,提问作者David Cohen1
相关产品推荐
相关产品推荐

