情况是这样的,第三方提供一个dll以及一个C++的接口文件,我需要通过该接口来开发程序,我这边想直接把C++的接口文件翻译成delphi版的,然后用delphi开发。
    现在的问题是第三方提供的C++接口文件中类的成员函数没有明确声明为__cdecl和__stdcall,我在网上查到的是如果不指定,类的成员函数默认是__thiscall,this指针通过ECX寄存器传参数,而__thiscall是只对C++有效,delphi是没有类似的关键字的,所以导致调用到函数后this指针的值是不对的。自己写了一个小例子来模仿该情况,跪求高手指教啊。C++代码//1.h
class A{
public:
virtual void hsshowmessage()=0; //该结构没有明确申明为__stdcall,默认应该是__thiscall
};
extern "C" __declspec(dllexport) A* CreateA(int a1,int b1);//1.cpp
#include "1.h"
#include <windows.h>
#include <stdio.h>
class B:public A{
private:
public:
virtual void hsshowmessage(){ //希望在delphi中调用到该函数,由于delphi中该函数默认是stdcall,所以调用传递过来的this指针值不对,从打印信息中可以看出来
char tmp[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);
}
int i;
int j;
};__declspec(dllexport) A* CreateA(int a1,int b1){
//A* A::CreateA(int a1,int b1){
B* b= new B;
b->i=a1;
b->j=b1;
char tmp[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);
return b;
}delphi代码type
  TForm1 = class(TForm)
    btn1: TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end; A = class
   procedure hsshowmessage();virtual;abstract; //delphi默认是stdcall的
end;const QTDLL = 'c.dll';function CreateA(a,b:Integer):A; cdecl;var
  Form1: TForm1;implementation{$R *.dfm}function CreateA; external QTDLL;procedure TForm1.btn1Click(Sender: TObject);
var
  ta:A;
begin
  ta:=CreateA(1,2);
  Application.MessageBox(PChar('project1.ext->btn1click:a='+IntToStr(Integer(ta))),'');
  ta.hsshowmessage;
end;