Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Delphi调用函数';s从Visual C++;? 我有一个用Visual C++ 2012编写的程序,我试图调用一个用Delphi编写的函数(我没有源码)。以下是Visual C++中的代码: int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D; test((void *)0x12345678);_C++_Visual Studio_Delphi_Visual C++_Assembly - Fatal编程技术网

如何使用Delphi调用函数';s从Visual C++;? 我有一个用Visual C++ 2012编写的程序,我试图调用一个用Delphi编写的函数(我没有源码)。以下是Visual C++中的代码: int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D; test((void *)0x12345678);

如何使用Delphi调用函数';s从Visual C++;? 我有一个用Visual C++ 2012编写的程序,我试图调用一个用Delphi编写的函数(我没有源码)。以下是Visual C++中的代码: int (_fastcall *test)(void*) = (int(_fastcall *)(void*))0x00489A7D; test((void *)0x12345678);,c++,visual-studio,delphi,visual-c++,assembly,C++,Visual Studio,Delphi,Visual C++,Assembly,但在编译代码中,它实际上是: .text:1000113B mov eax, 489A7Dh .text:10001140 mov ecx, 12345678h .text:10001145 call eax 而我例外的是: .text:1000113B mov ebx, 489A7Dh .text:10001140

但在编译代码中,它实际上是:

.text:1000113B                 mov     eax, 489A7Dh
.text:10001140                 mov     ecx, 12345678h
.text:10001145                 call    eax
而我例外的是:

.text:1000113B                 mov     ebx, 489A7Dh
.text:10001140                 mov     eax, 12345678h
.text:10001145                 call    ebx

我知道“FASTLCAL”使用Eax、ECX、EDX作为参数,但我不知道Visual C++编译器为什么使用EAX作为入口点。EAX不应该是第一个参数(12345678h)吗

我尝试在汇编代码中调用delphi函数,它可以工作,但我真的想知道如何在不使用汇编的情况下做到这一点

<> P>所以,VisualC++编译器可以生成代码吗?如果是,如何做到这一点?

Delphi的调用约定,也称为Borland fastcall,在x86上按顺序使用

然而,微软的fastcall呼叫约定使用不同的寄存器。它根本不使用EAX。相反,它对前两个参数使用ECX和EDX寄存器,如下所示

<> P>这样,您可以通过编写这些信息,将C++中的Delphi < Cube >登记登记> /COD>函数调用,将参数移动到<代码> EAX寄存器中。但是,让Delphi编译器来做这件事要容易得多。特别是当我想象你真正的问题涉及到多个函数和不止一个参数时

我建议您编写一些Pascal代码,以便在
stdcall
register
之间进行调整

function FuncRegister(param: Pointer): Integer; register; external '...';

function FuncStdcall(param: Pointer): Integer; stdcall;
begin
  Result := FuncRegister(param);
end;

exports
  FuncStdcall;

你可以从C++代码中调用<代码>函数STARDCAD/<代码>,让Delphi编译器处理参数传递。

看起来好像不谈EAX,我想你需要用另一个Delphi函数来桥接它,它用原件包装自己,但是使用DavidHeffernan。我看到有不止一种称为“快速调用”的约定,所以我称之为“pascal”。我修改了标题。很抱歉给您带来不便。@Plasmah是的,Microsoft的fastcall与EAX无关。我想做的是Borland/Embarcadero的快速呼叫。我不知道这是不是真的possible@MickeyShine:所以,当你知道ms fastcall不是你想要的,为什么你希望它表现得像你想要的那样?酷。但我不是德尔福的专家,我会花一些时间来试着按照你说的去做。非常感谢。