DLL如何導出類?

其實最好是寫一個父類,把要實現的函數全部以虛函數的形式寫在父類中,然後寫一個子類,繼承父類,重寫父類的虛函數。這樣的話就安全得多了。其次就在DLL中導出一個函數,返回父類的一個對象指針,再在EXE中動態鏈接DLL,調用導出函數。例子如下:

//以下是DLL的代碼

//class_a.h
class A
{
  public:
    virtual void fun()
    {
        //...
    }
}

//class_b.h
class B : public A
{
    public:
        void fun()
        {
           //...
        }
}

//dllMain.cpp
extern "C" __declspec(dllexport) A* GetObj();  //導出函數,返回一個A類的指針
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
    //....
    return 1;
}

A* GetObj()
{
    return new B();
}


//以下是EXE的代碼
#include "class_a.h"
typedef A* (*pObj)();  //定義一個函數指針
pObj fun;

int WINAPI WinMain( __in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in LPSTR lpCmdLine, __in int nShowCmd )
{
    HINSTANCE hDll = LoadLibrary(_T("sample.dll"));
    if (hDll == NULL)
    {
        MessageBox(0, _T("加載DLL失敗"), _T("Error"), 0);
        return -1;
    }

    //取函數指針
    fun = (pObj)GetProcAddress(hDll, "GetObj");
    if (fun == NULL)
    {
        MessageBox(0, _T("加載失敗。"), _T("錯誤"), MB_ICONSTOP);
        return -1;
    }

    A* p = fun();   //調用fun,返回一個A類指針p
    //之後就可以通過p來訪問DLL中的類了...
    return 0;
}

在EXE調用的時候,記得要把A類的頭文件包含,這樣一來就只是訪問了A類,而B類通過繼承A類並重寫A類的虛函數,來實現了功能,因此只有A類(相當於只是虛函數列表)暴露在外面,而B類則完全是在DLL內部實現的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章