试图将函数指针从 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);
1条答案
按热度按时间l5tcr1uw1#
您的呼叫约定不匹配。
Delphi 端的
TFoo
使用Delphi的默认register
约定(在CBuilder中为__fastcall
),Visual C根本不支持该约定。C++端的
foo
和foo2
使用MSVC的默认__cdecl
约定。因此,您需要让
TFoo
和foo/2
在两端使用相同的呼叫惯例,方法如下:TFoo
使用cdecl
,并且使foo/2
使用__cdecl
:第一个
TFoo
使用stdcall
,并且使foo/2
使用__stdcall
:第一个
这是仅有的两种保证在不同编译器之间兼容的调用约定。