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

从C++ DLL导入函数至Inno Setup时调用失败问题排查

问题排查与解决:Inno Setup调用自定义DLL函数报错"couldn't call proc"

问题根源

你的问题出在**C编译器的名字修饰(Name Mangling)**上。当用C编译__stdcall函数时,编译器会自动修改函数名(比如MyDllFunc会被改成_MyDllFunc@16,TestBool变成_TestBool@0),但你在Inno Setup脚本里用的是原始函数名,导致实际调用时找不到匹配的导出函数——这就是日志显示"导入成功"但调用失败的核心原因。

两种解决方案

方案1:用extern "C"禁用C++名字修饰

修改你的DLL代码,将导出函数用extern "C"包裹,强制编译器按照C语言规则导出函数名,避免名字修饰:

// dllmain.cpp
#include <windows.h>

// 用extern "C"包裹,禁用C++名字修饰
extern "C" {
    __declspec(dllexport) void __stdcall MyDllFunc(HWND hWnd, char *lpText, char *lpCaption, UINT uType)
    {
        MessageBoxA(hWnd, lpText, lpCaption, uType);
    }

    __declspec(dllexport) bool __stdcall TestBool()
    {
        return true;
    }
}

注意:必须加上__declspec(dllexport),明确告诉编译器要导出这些函数。

方案2:使用模块定义文件(.def)导出函数

如果不想修改代码,可以给Visual Studio项目添加一个.def文件,手动指定要导出的函数名:

  • 在VS项目中右键→添加→新建项→选择"模块定义文件(.def)"
  • 在.def文件中写入以下内容:
LIBRARY TestDll
EXPORTS
    MyDllFunc @1
    TestBool @2
  • 重新编译DLL,编译器会按照.def里的名字导出函数,不会进行C++名字修饰。

验证方法

编译后可以用VS自带的dumpbin工具查看DLL的导出表,确认函数名是否正确:
打开VS的开发者命令提示符,执行:

dumpbin /exports TestDll.dll

如果输出里显示的函数名是MyDllFunc和TestBool(没有下划线和@后缀),就说明导出正确了,此时再运行Inno Setup脚本就能正常调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 01:27:38