• 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

  • 相关阅读:
    Thinkpad R400无线网络一个都不见了!
    如果使用安卓4.4的SD卡?
    如何使用安卓4.4的SD卡?
    在IAR使用FreeRTOS出现Error[Pa045]: function "XXX" has no prototype
    DSP5509的RTC实验-第3篇
    LWM2M简介-学习记录
    DSP5509的定时器实验-第2篇
    DSP5509的XF实验-第一篇
    华为LiteOS系统使用-任务调度函数-第一篇
    2017-12-24自选的股票之春秋航空
  • 原文地址:https://www.cnblogs.com/findumars/p/9410806.html
Copyright © 2020-2023  润新知