创建/调用DLL时出现问题

时间:2010-06-19 00:38:16

标签: c delphi dll compilation inno-setup

我正在尝试创建一个稍后将在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”。

3 个答案:

答案 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 ;

看起来像拼写错误或错误......