Delphi中调用C++中导出的成员函数问题

[复制链接]
查看11 | 回复3 | 2021-1-27 06:53:04 | 显示全部楼层 |阅读模式
情况是这样的,第三方提供一个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;

分 -->
回复

使用道具 举报

千问 | 2021-1-27 06:53:04 | 显示全部楼层
c++中__thiscall约定主要指定给虚函数的,通常第三方还会提供一个相应的com接口吧,问他们有没有
没搞过这种勾当,你可以看看下面的做法
http://stackoverflow.com/questions/2667925/pass-a-delphi-class-to-a-c-function-method-that-expects-a-class-with-thiscal

回复

使用道具 举报

千问 | 2021-1-27 06:53:04 | 显示全部楼层
另外delphi的函数调用约定默认是register(fastcall),不是stdcall
回复

使用道具 举报

千问 | 2021-1-27 06:53:04 | 显示全部楼层
缺省的调用方法delphi肯定会支持的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行