QT跟VC++结合来进行插件的验证机制
2017-04-23 00:49
246 查看
由于最近公司要开发一个以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
一旦类使用虚函数,只要随便改动下增删查改下头文件的虚函数,就会导致程序在跑的时候进行乱跳,因为这个时候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 <class T> int vtableLength(T &object) { static_assert(std::is_polymorphic<T>::value, "at least has one virtual function"); static_assert(!std::is_pointer<T>::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; }
相关文章推荐
- ASP.NET MVC结合jQuery插件进行数据验证
- ASP.NET MVC结合jQuery插件进行数据验证
- (转载)ASP.NET MVC结合jQuery插件进行数据验证
- JQuery与Ajax的结合进行文本框内容验证
- 使用jquery的验证插件进行客户端验证
- Qt5的插件机制(4)--Qt插件的元信息metaData
- 使用Qt插件在Qt中进行ROS开发
- Qt的插件机制(转)
- VC SQL 登录对话框数据库对用户名和密码进行验证代码!
- Qt插件机制的学习
- 使用JQuery validate插件进行客户端验证
- 使用QT中的Signal&Slot机制进行传值
- Qt插件机制的学习
- javascript结合正则进行表单验证1
- Qt的插件机制
- 使用jquery.validate.js插件进行表单里控件的验证
- QT的插件机制在程序发布时易出现的问题
- spring mvc 结合Hibernate Validator进行服务器验证
- Qt的插件机制
- Vc中对话框数据交换和验证机制