我使用这种方法一般是因为没有.h .a(.lib)文件的支持下,只能使用QLibrary进行手动提取。

一、常用函数

1
2
3
4
5
bool	load();//加载 需要指定了文件名,跟文件的open一样
bool unload();//卸载
void setFileName(const QString & fileName); //设置库名
QFunctionPointer resolve(const char * symbol); //函数名
QString errorString() const; //错误信息

二、使用例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
显示调用
QLibrary myLib("mylib");
typedef void (*MyPrototype)();
MyPrototype myFunction = (MyPrototype) myLib.resolve("mysymbol");
if (myFunction)
myFunction();
隐式调用
typedef void (*MyPrototype)();
MyPrototype myFunction =
(MyPrototype) QLibrary::resolve("mylib", "mysymbol");
if (myFunction)
myFunction();

//上面typedef void (*fun)()为指定一个指针fun为指向反回值为void没有参数的函数指针

三、加载类

​ 如果调用函数方法,可以通过上面去加载!类呢?类是由编译期就完成的了!无法实时去索引。经搜索,还真发现了可以完成的例子。

​ 他利用虚表的特性,在运行时可以动态索引。使用一个接口类,对外进行公开,添加创建对象函数,返回类型为接口类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class TestInterface
{
public:
virtual ~TestInterface()
{
}

virtual int getValues() = 0;
}

class TESTDLL_LIBSHARED_EXPORT TestDLL_lib : public TestInterface
{

public:
TestDLL_lib();
virtual ~TestDLL_lib();

int a;
int b;
int c;

int getValues() override; // MSVC may not support "override"
};

// return pointer to interface!
// TestDLL_lib can and should be completely hidden from the application
extern "C" TESTDLL_LIBSHARED_EXPORT TestInterface *create_TestDLL_lib()
{
return new TestDLL_lib();
}
//https://stackoverflow.com/questions/26234327/qlibrary-import-a-class