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內部實現的。
//以下是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內部實現的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.