情况是这样的,第三方提供一个dll以及一个C++的接口文件,我需要通过该接口来开发程序,我这边想直接把C++的接口文件翻译成delphi版的,然后用delphi开发。
现在的问题是第三方提供的C++接口文件中类的成员函数没有明确声明为__cdecl和__stdcall,我在网上查到的是如果不指定,类的成员函数默认是__thiscall,this指针通过ECX寄存器传参数,而__thiscall是只对C++有效,delphi是没有类似的关键字的,所以导致调用到函数后this指针的值是不对的。自己写了一个小例子来模仿该情况,跪求高手指教啊。
C++代码
//1.h
classA{
public:
virtualvoidhsshowmessage()=0;//该结构没有明确申明为__stdcall,默认应该是__thiscall
};
extern"C"__declspec(dllexport)A*CreateA(inta1,intb1);
//1.cpp
#include"1.h"
#include
#include
classB:publicA{
private:
public:
virtualvoidhsshowmessage(){//希望在delphi中调用到该函数,由于delphi中该函数默认是stdcall,所以调用传递过来的this指针值不对,从打印信息中可以看出来
chartmp[100];
//通过delphi调用到这里this指针的值与delphi中创建的对象的值不同。
sprintf(tmp,"c.dll->hsshowmessage:b=%d,i=%d,j=%d",int(this),i,j);
MessageBox(NULL,TEXT(tmp),TEXT(""),MB_OK);
}
inti;
intj;
};
__declspec(dllexport)A*CreateA(inta1,intb1){
//A*A::CreateA(inta1,intb1){
B*b=newB;
b->i=a1;
b->j=b1;
chartmp[100];
sprintf(tmp,"c.dll->CreateA:b=%d,i=%d,j=%d",int(b),b->i,b->j);
MessageBox(NULL,TEXT(tmp),TEXT(""),MB_OK);
returnb;
}
delphi代码
type
TForm1=class(TForm)
btn1:TButton;
procedurebtn1Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
A=class
procedurehsshowmessage();virtual;abstract;//delphi默认是stdcall的
end;
constQTDLL='c.dll';
functionCreateA(a,b:Integer):A;cdecl;
var
Form1:TForm1;
implementation
{$R*.dfm}
functionCreateA;externalQTDLL;
procedureTForm1.btn1Click(Sender:TObject);
var
ta:A;
begin
ta:=CreateA(1,2);
Application.MessageBox(PChar('project1.ext->btn1click:a='+IntToStr(Integer(ta))),'');
ta.hsshowmessage;
end;
分 -->
|