64,439
社区成员
发帖
与我相关
我的任务
分享
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.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
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);
}
}
#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在同一目录。