从C++调用 Delphi

ztmd8pv5  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(201)

试图将函数指针从 Delphi 中创建的可执行文件传递到用Visual C创建的dll函数。当C端调用Delphi中具有单个int类型参数的指针函数时,此变量显示为某个巨大的数字,而不是数字“1”。我做错了什么?
C++端:

void (*foo)(int);
extern "C" void _stdcall setFoo(void (*foo2)(int))
{
    foo = foo2;

    foo(1);
}

Delphi 方面:

TFoo = procedure(val: integer) ;
  TSetFoo = procedure( val: TFoo) ; stdcall;
...
  Foo: TFoo;
  SetFoo:TSetFoo;

...

procedure fooH( val : integer);
begin
ShowMessage('foo '+inttostr(val));
end;
...
setFoo(fooH);
l5tcr1uw

l5tcr1uw1#

您的呼叫约定不匹配。
Delphi 端的TFoo使用Delphi的默认register约定(在CBuilder中为__fastcall),Visual C根本不支持该约定。
C++端的foofoo2使用MSVC的默认__cdecl约定。
因此,您需要让TFoofoo/2在两端使用相同的呼叫惯例,方法如下:

  • 使TFoo使用cdecl,并且使foo/2使用__cdecl

第一个

  • 使TFoo使用stdcall,并且使foo/2使用__stdcall

第一个
这是仅有的两种保证在不同编译器之间兼容的调用约定。

相关问题