1. 程式人生 > >C++ 動態載入動態庫 呼叫庫中類 及類中方法

C++ 動態載入動態庫 呼叫庫中類 及類中方法

原文地址: https://stackoverflow.com/questions/26234327/qlibrary-import-a-class

c++ 的類中方法定位是編譯時就完成的,而不是在run-time時去定位,所以動態載入時無法直接通過類名::函式名的方式呼叫到類中的方法。

但是這裡有一種使用非常廣泛的方式。

可以對要匯出的類新增一個介面類,做成獨立的檔案並向外公開。對可能要對外公開的函式都在介面類中做成虛擬函式。這樣通過虛表的方式使其可以再run-time 去進行定位。

再對類新增建立物件函式,返回型別為介面類型別,並通過c語言函式匯出。

第三方呼叫時,將介面類檔案新增到對方工程中,而實際的功能程式碼不暴露出去,可以對程式碼起到一定的保護作用 。用創物件函式呼叫,然後就可以進行使用了。

對於類中的靜態方法,可以單獨提取出來,做成C語言函式。

示例

“interface.h”

class BaseInterface
{
public:
    virtual int fun1(){ return 1; }
    virtual void fun3() =0;
};

“base.cpp”

class __declspec(dllexport) Base :public BaseInterface
{
    virtual int fun1() override
    {
        return 10;
    }
    virtual void fun3() override
    {
        printf("gogog\n");
    }
};

__declspec(dllexport) BaseInterface* getBaseObject()
{
    return new Base();
}