gpt4 book ai didi

c++ - 从 C++ 调用 Delphi

转载 作者:行者123 更新时间:2023-12-05 03:17:08 29 4
gpt4 key购买 nike

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

C++ 方面:

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

foo(1);
}

德尔福方面:

  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);

最佳答案

您的调用约定不匹配。

TFoo 在 Delphi 端使用 Delphi 的默认 register 约定(C++Builder 中的 __fastcall),Visual C++ 不支持完全没有。

C++ 端的

foofoo2 使用 MSVC 的默认 __cdecl 约定。

因此,您需要使 TFoofoo/2 在两侧使用相同的调用约定,方法是:

  • TFoo使用cdecl,让foo/2使用__cdecl:
typedef void (__cdecl *fooType)(int);

fooType foo;
extern "C" void __stdcall setFoo(fooType foo2)
{
foo = foo2;
foo(1);
}
type
TFoo = procedure(val: integer); cdecl;
TSetFoo = procedure(val: TFoo); stdcall;

var
Foo: TFoo;
SetFoo: TSetFoo;

...

procedure fooH( val : integer); cdecl;
begin
ShowMessage('foo ' + IntToStr(val));
end;

...

setFoo(fooH);
  • TFoo使用stdcall,让foo/2使用__stdcall:
typedef void (__stdcall *fooType)(int);

fooType foo;
extern "C" void __stdcall setFoo(fooType foo2)
{
foo = foo2;
foo(1);
}
type
TFoo = procedure(val: integer); stdcall;
TSetFoo = procedure( val: TFoo); stdcall;

var
Foo: TFoo;
SetFoo:TSetFoo;

...

procedure fooH( val : integer); stdcall;
begin
ShowMessage('foo ' + IntToStr(val));
end;

...

setFoo(fooH);

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

关于c++ - 从 C++ 调用 Delphi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74293075/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com