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一直遇到0html

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;
}
相關文章
相關標籤/搜索