QT跟VC++结合来进行插件的验证机制
欢迎技术交流和帮助,提供IT相关服务,如果有需要,请联系博主QQ: 503587937
由于最近公司要开发一个以C++插件机制为主的,主要有一个问题就是C++的二进制兼容性的问题。
一旦类使用虚函数,只要随便改动下增删查改下头文件的虚函数,就会导致程序在跑的时候进行乱跳,因为这个时候exe跟dll里面的vtable模型是不一致的
刚好程序是使用QT开发了,所以就用了两种方式来保证头文件一致才能进行程序的加载
1. 利用QT的MOC机制
QT的MOC机制里面有一个Q_INVOKABLE的宏定义,可以让moc生成类成员函数的相关信息,
然后利用QObject里面的method来获取对应的函数参数和函数顺序
用于保证虚函数的顺序,参数一致
具体查看QObject的相关文档
http://doc.qt.io/qt-5/qobject.html
http://doc.qt.io/qt-5/qmetaobject.html
http://doc.qt.io/qt-5/qmetamethod.html
从qobject里面或者metaobject再获取metamethod,即可获取指定的函数信息
2. 遍历vtable,保证虚函数的个数一致。如何获取vtable的在网上有很多文章,下面主要是针对VS2015的编译器代码
下面代码主要做的事情:
1. 保证传入的程序有虚函数
2. 保证T不指针类型
3. 获取vtable
4. 遍历vtable一直遇到0
template
int vtableLength(T &object)
{
static_assert(std::is_polymorphic::value,
"at least has one virtual function");
static_assert(!std::is_pointer::value,
"type not allow pointer");
int* vptr = (int*)&object;
int* vtable = (int*)*vptr;
int len = 0;
for (int i = 0;
vtable[i] != 0;
i++)
{
len++;
}
return len;
}
【QT跟VC++结合来进行插件的验证机制】
推荐阅读
- “不完美,才美”01(190410)
- 良心
- 我的小叔
- 只有经历了才真正懂得的伤痛
- 跟身体谈恋爱
- 【38】“劳逸结合”的重要性
- 诱惑的世界
- 每一根头发丝都在跟我说我今天很开心
- 爱情就是“你要去哪,我跟你一起去”
- HTML基础--基本概念--跟着李南江学编程