Delphi如何调用QT写的DLL?

chenylin 2018-12-20 10:07:36
QT的DLL中封装了MTrans的doTrans静态函数,DLL名称是:MTrans.dll;用传统的方法不能正确调用。定义是这样的:


unit UMTrans;

interface

Uses Sysutils;

function doTrans(aName:PChar):pchar; stdcall;

implementation

function doTrans; external 'MTrans.dll';

end.

请教各位,QT写的DLL,用Delphi调用要如何写?
...全文
485 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenylin 2018-12-24
  • 打赏
  • 举报
回复
引用 5 楼 早打大打打核战争 的回复:
从这个C++名来看,传入的参数是一个QString引用,MTrans::doTrans(QString& str);这种形式,而QString是一个类,无法翻译为PChar。涉及到类的互操作,不同C++编译器之间都很难做到兼容。你要么找到它的C导出DLL,要么用C++写一个包装,导出一个C接口函数能接收PChar参数,内部调用这个doTrans。
感谢给的方案,应该也只能再封装一下了。
  • 打赏
  • 举报
回复
从这个C++名来看,传入的参数是一个QString引用,MTrans::doTrans(QString& str);这种形式,而QString是一个类,无法翻译为PChar。涉及到类的互操作,不同C++编译器之间都很难做到兼容。你要么找到它的C导出DLL,要么用C++写一个包装,导出一个C接口函数能接收PChar参数,内部调用这个doTrans。
  • 打赏
  • 举报
回复
因为它导出的是C++名,并非doTrans,doTrans只是一个逻辑名,只存在于源码中,由C++编译器维护逻辑名和DLL实际导出名之间的关联。你可以用tdump/tfump64工具看一下它的DLL的实际导出,然后:
function doTrans; external 'MTrans.dll' name 'xxx';
chenylin 2018-12-20
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
因为它导出的是C++名,并非doTrans,doTrans只是一个逻辑名,只存在于源码中,由C++编译器维护逻辑名和DLL实际导出名之间的关联。你可以用tdump/tfump64工具看一下它的DLL的实际导出,然后: function doTrans; external 'MTrans.dll' name 'xxx';
我也修改了定义文件: unit UMTrans; interface Uses Sysutils; procedure doTrans(aName:PWideChar); stdcall; implementation procedure doTrans; external 'MTrans.dll' name '_ZN6MTrans7doTransER7QString'; end. 调用很简单: procedure TForm1.Button1Click(Sender: TObject); var P: pWideChar; begin P := pwidechar(Edit1.Text); doTrans(P); Edit2.Text:=WideString(P); end; 但是会报错。
chenylin 2018-12-20
  • 打赏
  • 举报
回复
引用 1 楼 早打大打打核战争 的回复:
因为它导出的是C++名,并非doTrans,doTrans只是一个逻辑名,只存在于源码中,由C++编译器维护逻辑名和DLL实际导出名之间的关联。你可以用tdump/tfump64工具看一下它的DLL的实际导出,然后: function doTrans; external 'MTrans.dll' name 'xxx';
用了tdump工具,确实查到了你说的情形: Exports from MTrans.dll 3 exported name(s), 3 export addresse(s). Ordinal base is 1. Sorted by Name: RVA Ord. Hint Name -------- ---- ---- ---- 00001600 1 0000 _ZN6MTrans7doTransER7QString 000015F0 2 0001 _ZN6MTransC1Ev 000015F0 3 0002 _ZN6MTransC2Ev --------------------------------------------------------------- 我修改了定义文件,运行不报错了,但是调用还是会报错,不知头绪。 下面是QT的调用例子,不知道是什么原因 #include "dialog.h" #include "ui_dialog.h" #include <mtrans.h> Dialog::Dialog(QWidget *parent) : QDialog(parent), ui(new Ui::Dialog) { ui->setupUi(this); } Dialog::~Dialog() { delete ui; } void Dialog::on_pushButton_clicked() { QString content=ui->textEdit1->toPlainText(); MTrans::doTrans(content); ui->textEdit2->setText(content); }
doloopcn 2018-12-20
  • 打赏
  • 举报
回复
unit UMTrans;

interface

Uses Sysutils;

function doTrans(aName:PChar):pchar;External 'MTrans.dll';

implementation
......

另外要注意的就是DLL中的Char版本是WideChar还是AnsiChar,PChar在旧版(D7)中为PAnsiChar,而在新的版本是(XE)中为PWideChar

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧