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

3

我希望能够得到你的帮助。 我知道有很多地方可以获取这些信息。但是,无论如何,我在将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个回答

3
  1. 如果DLL与可执行文件在同一个目录下,它将被找到。
  2. Delphi DLL 导出的名称为HW而不是_HW。
  3. 调用约定可能不匹配。我怀疑 Delphi 使用的是寄存器调用约定,而 C++ 使用的是 cdecl 调用约定。请注意,我不能百分之百确定 C++ Builder 在这里默认使用 cdecl,您可以检查一下。

更严重的问题是,您不能像这样跨 DLL 边界传递 TForm。当您在 DLL 中调用对象上的方法时,您正在调用 DLL 中的代码,而不是主机 exe 中的代码。但是,您需要调用属于该对象的代码,因为那是与该对象相关联的代码。

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


David,谢谢你的回答。我再次检查了一下:是的,错误在于我把dll放错了文件夹。现在一切都正常了。我还检查了一些东西——你可以将TForm和所有其他VCL组件传递给dll。 - an40us
1
@user 不,你不能这样传递一个 TForm。读取句柄属性这样简单的操作就可以了。实际上,很多东西可能会起作用,但也有很多会失败。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接