zoukankan      html  css  js  c++  java
  • QT跟VC++结合来进行插件的验证机制(遍历vtable,保证虚函数的个数一致,也可使用Q_INVOKABLE宏定义)

    由于最近公司要开发一个以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;
    }

    https://www.cnblogs.com/linyilong3/p/6750516.html

  • 相关阅读:
    《TCP/IP网络协议基础》笔记
    《MySQL基础知识》笔记
    tc。数组的定义。
    tc。单等号,双等号的作用。
    tc。用浏览器加载gif图片。
    tc。做无界面的程序。
    做馒头一斤面放多少水。
    用笼屉蒸馒头好吃,还是用蒸柜蒸馒头好吃。上汽的大小。
    千层馒头的制作。
    馒头店,普遍是开在菜市场附近。
  • 原文地址:https://www.cnblogs.com/findumars/p/9410806.html
Copyright © 2011-2022 走看看