在C ++ Builder中连接和使用Delphi DLL

时间:2011-10-26 06:40:23

标签: delphi delphi-2010 c++builder c++builder-2010

我想请求一些帮助。 我知道,有很多地方,我可以获得这些信息。但是,无论如何,我在将Delphi DLL连接到我的C ++ Builder项目时遇到了问题。

例如,我的Delphi DLL看起来像:

library f_dll;

uses
  SysUtils,
  Classes,
  Forms,
  Windows;

procedure HW(AForm : TForm);
        begin
                MessageBox(AForm.Handle, 'DLL message', 'you made it!',MB_OK);
        end;
exports
        HW;

{$R *.res}

begin

end.

这就是我在内部连接DLL和函数的方式:

//defining a function pointer type
typedef void (*dll_func)(TForm* AForm);

dll_func HLLWRLD = NULL;

HMODULE hDLL = LoadLibrary("f_dll.dll");
if (!hDLL) ShowMessage("Unable to load the library!");

//getting adress of the function
HLLWRD = (dll_func)GetProcAddress(hDLL, "_HW"); 

if (!pShowSum) ShowMessage("Unable to find the function");

HLLWRLD(Form1);

FreeLibrary(hDLL);

我没有来自编译器的错误消息,我只有我的消息框说,dll没有连接。我把我的dll放在项目文件夹的Debug文件夹中。但是没有任何联系。

拜托,我请你帮帮我。我的错是什么?

编辑:我发布了错误的C ++代码,所以这是正确的(这适用于有类似问题的人):

//defining a function pointer type
typedef void (*dll_func)(TForm* AForm);

dll_func HLLWRLD = NULL;

HMODULE hDLL = LoadLibrary("f_dll.dll");
if (!hDLL) ShowMessage("Unable to load the library!");

//getting adress of the function
HLLWRD = (dll_func)GetProcAddress(hDLL, "HW");  //HW instead _HW

if (!HLLWRLD) ShowMessage("Unable to find the function"); //HLLWRLD instead pShowSum

HLLWRLD(Form1);

FreeLibrary(hDLL);

1 个答案:

答案 0 :(得分:3)

  1. 如果DLL与可执行文件位于同一目录中,则会找到它。
  2. Delphi DLL导出的名称是HW而不是_HW。
  3. 调用约定可能不匹配。它在Delphi中注册,在C ++中注册cdecl我怀疑。请注意,我不是100%确定C ++ Builder默认为cdecl,您可以查看。
  4. 更严重的问题是你根本无法像这样在DLL边界上传递TForm。当您在DLL中的对象上调用方法时,您正在调用DLL中的代码而不是主机exe中的代码。但是这是exe中需要调用的代码,因为那是属于该对象的代码。

    您需要切换到运行时包或接口。