zoukankan      html  css  js  c++  java
  • QT跟VC++结合来进行插件的验证机制

    由于最近公司要开发一个以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 <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;
    }
    
  • 相关阅读:
    程序员需要的各种PDF格式电子书【附网盘免费下载资源地址】
    Web安全大揭秘
    tar 压缩解压命令详解
    django开发项目的部署nginx
    CentOS7安装mysql-python模块
    我的博客站点上线了
    2006
    centos7安装pip
    mysql删除匿名用户
    FilenameFilter 文件名过滤
  • 原文地址:https://www.cnblogs.com/linyilong3/p/6750516.html
Copyright © 2011-2022 走看看