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

为何Inno Setup无法加载自定义DLL中的函数?

解决Inno Setup调用自定义DLL函数加载失败的问题

针对你遇到的无法加载DLL或找不到指定过程的问题,可按以下步骤排查修复:

1. 确保架构完全匹配

Inno Setup默认使用32位架构,若你的DLL编译为64位,必然出现加载失败:

  • 若使用32位Inno Setup:将DLL项目编译目标设为Win32(无论Debug/Release)
  • 若需支持64位系统:在Inno Setup脚本中添加ArchitecturesInstallIn64BitMode=x64,同时将DLL编译为x64版本,确保脚本引用对应架构的DLL文件

2. 统一函数调用约定

你的Inno Setup脚本声明函数使用cdecl调用约定,但VC++默认调用约定为stdcall,两者不匹配会导致无法找到过程:

方案一:修改C++函数为cdecl约定

修改C++函数声明与实现:

EXTERN_C_START

__declspec(dllexport) DWORD __cdecl StopService(PCWSTR serviceName, DWORD waitStopTimeoutMilliseconds);

EXTERN_C_END
DWORD __cdecl StopService(PCWSTR serviceName, DWORD waitStopTimeoutMilliseconds)
{
    // 函数实现逻辑
}

方案二:修改Inno Setup脚本使用stdcall约定

调整Pascal函数声明:

function StopService(ServiceName: String; TimeOut: Integer): Integer;
external 'StopService@InnoSetupHelper.dll stdcall delayload loadwithalteredsearchpath'; 

3. 验证函数导出名称正确性

即使使用EXTERN_C,C++编译器仍可能对函数名进行修饰,需确认导出表:

  • 用VS自带的dumpbin工具检查导出函数:
    dumpbin /exports 你的DLL路径\InnoSetupHelper.dll
    
  • 若导出名称与StopService不一致,添加.def文件强制指定导出名:
    创建InnoSetupHelper.def文件:
    LIBRARY "InnoSetupHelper"
    EXPORTS
        StopService @1
    
    将该文件添加到VC++项目,在链接器设置中指定为输入定义文件

4. 确保DLL可被正确定位

你使用了dontcopy标志,DLL不会被解压到安装临时目录,需保证路径有效性:

  • 尝试去掉dontcopy,改用temporary标志让Inno Setup自动解压DLL到临时目录:
    [Files]
    Source: "publish\InnoSetupHelper.dll"; Flags: temporary
    
    对应的函数声明可简化为:
    function StopService(ServiceName: String; TimeOut: Integer): Integer;
    external 'StopService@InnoSetupHelper.dll cdecl delayload'; 
    

5. 检查DLL依赖库

DLL可能依赖VC++运行时库,若目标机器未安装对应版本会加载失败:

  • Debug版本依赖调试版运行时(如vcruntime140d.dll),仅适合开发测试,发布需用Release版本
  • 你的Release项目已设置RuntimeLibrary=MultiThreaded(静态链接),无需依赖外部运行时;若为动态链接,需确保目标机器安装对应版本的VC++ Redistributable

内容的提问来源于stack exchange,提问作者huang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:40:43