- 主题:咨询个 QLibrary 的问题
用 QLibrary 可以动态的加载一个 dll. 然后动态的调用这个 dll 里面的函数。
但是 dll 里面的函数会有不同的 Calling convention。比如 __stdcall,__cdecl,__pascal,__fastcall
在 Qt 里,我如何指定 Qlibrary 加载的函数指针用哪种 calling convention 调用函数呢。。。
--
FROM 120.244.156.*
关键看你在 c++ 里面是怎么声明的。
QLibrary 只给出一个函数指针,类型是 void (*)(void),你需要自己强转一下:
typedef int (WINAPI * MyCallback)(int, int);
MyCallback cb = (MyCallback) library->resolve("callback");
if (cb) {
cb(1,2);
}
EDIT: 之前 WINAPI 的位置写错了,应该写在括号里面。
【 在 dormouseBHU (dormouseBHU) 的大作中提到: 】
: 用 QLibrary 可以动态的加载一个 dll. 然后动态的调用这个 dll 里面的函数。
: 但是 dll 里面的函数会有不同的 Calling convention。比如 __stdcall,__cdecl,__pascal,__fastcall
: 在 Qt 里,我如何指定 Qlibrary 加载的函数指针用哪种 calling convention 调用函数呢。。。
: ...................
--
修改:hgoldfish FROM 117.24.206.*
FROM 112.47.122.*
我也是这么想的,但是编译会报错。。。
【 在 hgoldfish 的大作中提到: 】
: 关键看你在 c++ 里面是怎么声明的。
: QLibrary 只给出一个函数指针,类型是 void (*)(void),你需要自己强转一下:
: typedef WINAPI int (*MyCallback)(int, int);
: ...................

--
FROM 120.244.156.*
有完整的测试用例吗?
【 在 dormouseBHU (dormouseBHU) 的大作中提到: 】
: 我也是这么想的,但是编译会报错。。。
: [upload=1][/upload]
--
FROM 112.47.122.*
是不是include了.h(函数声明),又定义了函数指针,二者重名了
【 在 dormouseBHU 的大作中提到: 】
:
: 我也是这么想的,但是编译会报错。。。
:
: 【 在 hgoldfish 的大作中提到: 】
: : 关键看你在 c++ 里面是怎么声明的。
--
FROM 1.89.14.*
下面注释掉的两行都编译通不过。 VS2017.
#include <QCoreApplication>
#include <QLibrary>
#include <QDebug>
typedef short ( *FUNCTION) (int, int);
//typedef __stdcall short ( *FUNCTION) (int, int);
//typedef __cdecl short ( *FUNCTION) (int, int);
FUNCTION add;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QLibrary myLib("mydll");
myLib.load();
qDebug() << myLib.isLoaded();
add = (FUNCTION) myLib.resolve("Add");
return a.exec();
}
【 在 hgoldfish 的大作中提到: 】
: 有完整的测试用例吗?
:
--
FROM 120.244.156.*
typedef short (__stdcall * FUNCTION) (int, int);
修饰符写在里面。
【 在 dormouseBHU (dormouseBHU) 的大作中提到: 】
: 下面注释掉的两行都编译通不过。 VS2017.
: #include <QCoreApplication>
: #include <QLibrary>
: ...................
--
修改:hgoldfish FROM 117.24.206.*
FROM 117.24.206.*