我正在尝试创建一个稍后将在Inno Setup中使用的DLL。 我设法使用Pelles作为IDE创建DLL,使用以下代码:
#include <windows.h>
__declspec(dllexport) int sumT(){
return 2;
}
然后我使用以下Delphi代码将DLL映射到Inno Setup中的函数:
function Hellow() : Integer ;
external 'sumT@files:yyy.dll stdcall';
它按预期工作,返回2.我也可以从rundll32.exe调用它 - 如果我在DLL中添加一个MsgBox,它会出现,证明一切都按预期工作。
现在,当我尝试将值传递给DLL时问题就开始了,例如:
#include <windows.h>
__declspec(dllexport) int sumT(int sumTah){
return sumTah;
}
停止工作! 在Inno Setup中,我给了我一条消息:
“运行时错误(在-1:0)”
如果我尝试使用rundll32.exe,我会得到:
yyy.dll中的错误
缺少参赛作品:sumT
我不打算在这里粘贴Delphi代码,因为我几乎尝试了一切,与C代码一样,我尝试使用__stdcall,将参数声明为INT,UINT ......以及其他我忘记的事情。
我也查了MSDN,但找不到任何与此特定问题有关的内容。
那么,有人可以帮忙吗?
由于
编辑:我在C编译,所以不需要“extern”。答案 0 :(得分:2)
导出的名称可能与您认为的不一样。在DLL上使用dumpbin.exe / exports查看实际的导出名称。使用extern“C”来抑制名称重整。
另外,你必须声明这个函数__stdcall,这就是你的Delphi声明所说的。默认值为__cdecl。当你开始传递参数时,这将失败。
答案 1 :(得分:1)
如果使用C ++编译器进行编译,则函数名称会受到损坏,因此它包含有关参数的数据。解决方案是做类似的事情:
extern "C" __declspec(dllexport) int myfn();
然后将其引用为_myfn。 extern "C"
告诉编译器不要破坏函数名。这不适用于模板化函数,类或重载函数。
答案 2 :(得分:1)
__ declspec(dllexport)int sumT(int sumThah ){
返回 sumTah ;
看起来像拼写错误或错误......