怎么调用第三方DLL导出的Interface?

一如当初 2013-06-23 12:56:27
我想在C++中使用Delphi开发的DLL导出的接口实现

Delphi DLL
library Project1;

uses
Winapi.Windows, System.SysUtils;

type
ITest = interface(IUnknown)
function ShowInt(V1, V2: Integer): Integer stdcall;
end;

TTest = class(TInterfacedObject, ITest)
function ShowInt(V1, V2: Integer): Integer stdcall;
end;

function TTest.ShowInt(V1, V2: Integer): Integer;
begin
Result := 888;
end;

function Get: ITest stdcall;
begin
Result := TTest.Create;
end;

exports
Get;

begin
end.


很简单,定义了一个接口ITest,该接口有一个方法ShowInt,返回一个整数888
我在C++中这么写的


//ITest.h
#ifndef ITEST_H
#define ITEST_H

#include <Unknwn.h>

interface ITest : public IUnknown
{
virtual int __stdcall ShowInt(int v1, int v2) = 0;
};

#endif // ITEST_H


然后我尝试动态加载DLL并调用。用的Qt


QLibrary lib("Project1");
if (lib.load()) {
typedef ITest* (__stdcall *Get)();
Get method = (Get)lib.resolve("Get");

ITest *obj = method(); // 这里会发生异常
if (obj != nullptr) {
obj->ShowInt(777, 888);
}
}


搞了一天了……谁指点一下
...全文
196 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bbc9527 2013-06-23
  • 打赏
  • 举报
回复
通用的办法 就是 看下 WINDOWS+PE权威指南 这本书 了解下 PE结构 还有就是编译好的程序 用OD调试器 调试 虽然是在反汇编 查看问题比较容易 两个不同的编译器 调用 错误 不从汇编分析 查看堆栈 寄存器的数据变化 是分析不了问题的 那么些概念 有点太虚了 ,实际一点
Inhibitory 2013-06-23
  • 打赏
  • 举报
回复
这个涉及到编译后的内容的组织方式,即ABI并不通用,尤其是涉及到C++的内容,通用的可能性非常小。
bbc9527 2013-06-23
  • 打赏
  • 举报
回复
http://www.linuxdiyf.com/1/article/2006/0701/article_474.html 这个可能对你有用
bbc9527 2013-06-23
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390496969 这个是我唯一得分的帖子 也是第一个得分的帖子,感谢。
橡木疙瘩 2013-06-23
  • 打赏
  • 举报
回复
确认dll与exe在同一目录 确认你的dll不依赖于其它不在当前目录的dll 改一下delphi代码,在函数名前加个下划线试试
橡木疙瘩 2013-06-23
  • 打赏
  • 举报
回复
最好把接口指针放到智能指针里:

#include <boost/smart_ptr>
#include <cassert>

void intrusive_ptr_add_ref(ITest* p)
{
  assert(p);
  p->AddRef();
}
void intrusive_ptr_release(ITest* p)
{
  assert(p);
  p->Release();
}

typedef boost::intrusive_ptr<ITest> ITestPtr;

ITestPtr obj = ITestPtr( method () );
不过你的问题是在调用dll时,检查一下method的值吧。 要确保执行时你的dll与exe在同一目录。
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
com 不只是继承 iunknown 就完了哦,但是不了解 delphi,不知道是不是它会帮你完成剩下的事。 你可以看下崩溃前那个 method 变量是否为空的
一如当初 2013-06-23
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
dll 并不跨语言,com 才是跨语言的。 dll 要通用,最好只使用 c 语言接口
继承自IUnknown的不是COM嘛
www_adintr_com 2013-06-23
  • 打赏
  • 举报
回复
dll 并不跨语言,com 才是跨语言的。 dll 要通用,最好只使用 c 语言接口

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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