You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:27:13