是否可以从C代码调用C ++ DLL中的函数?
该函数未声明为extern "C"
。
一个丑陋的平台依赖黑客只适用于Visual Studio很好。
调用约定不应该是一个主要问题,但我如何处理名称修改。
例如,对于Visual Studio,带有签名void f()
的C ++函数具有错位名称?f@@YAXXZ
,并且不是合法的C标识符。
(你不需要告诉我,我应该将C ++函数声明为extern "C"
。
我已经知道了。但我处于无法更改C ++代码的情况。)
答案 0 :(得分:8)
在另一个C ++函数中包装冒犯函数,并用extern "C"
声明它。无需为它创建特殊的DLL,只需在项目中包含一个C ++文件即可。
答案 1 :(得分:4)
要使编译器静态链接具有不同导出名称的函数可能会很棘手。但您始终可以使用LoadLibrary
加载DLL,然后使用GetProcAddress
。
答案 2 :(得分:2)
您可以调查
LoadLibrary("path to dll");
加载DLL和
GetProcAddress("?f@@YAXXZ");
获取指向外部声明函数的函数指针。
答案 3 :(得分:1)
除了创建一个用C ++编写的额外dll并通过extern“C”公开所有接口之外,我没有看到任何干净的解决方案。
答案 4 :(得分:0)
您可以使用他们使用的相同C ++编译器编译您的C代码,然后您的C函数将使用相同的机制进行损坏,一切都将无缝链接,没有人会注意到任何差异。
如果必须使用其他编译器,则必须使用LoadLibrary手动加载dll,并使用GetProcAddress手动加载每个函数。