// Interface.h 公共文件/////////////////////////////////////////////////
#pragma once
class Interface
{
public:
virtual void ShowMsg() = 0; // 將調用方需要調用的成員函數聲明成純虛函數
virtual ~Interface(){};// 抽象類的虛析構函數
};
// Interface.cpp 被調用方文件////////////////////////////////////////////////
// 注意下面的代碼並不是實現 Interface 類,而是因爲聯繫緊密才寫在這。
#include "stdafx.h"
#include "Test.h"
#include "Interface.h"
// 通過導出函數形式向調用方提供指向派生類對象的基類指針
extern "C" __declspec(dllexport) Interface* Export(void)
{
return (Interface*)new Test();
}
將真正要調用的類聲明成抽象類 Interface 的派生類:
// Test.h 被調用方文件//////////////////////////////////////////
// 類的聲明
#pragma once
#include "Interface.h"
class Test:public Interface
{
public:
Test()
virtual ~Test();
virtual void ShowMsg(void);
private:
CString s;
};
// Test.cpp 被調用方文件////////////////////////////////////////
// 類的實現
#include"stdafx.h"
#include"Test.h"
Test::Test()
{
s = "hello form dll";
}
Test::~Test()
{
AfxMessageBox(_T("destructor"));
}
void Test::ShowMsg()
{
AfxMessageBox(s);
}
在調用方調用DLL時動態加載:
// 調用方文件 /////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Interface.h" // 包含抽象類從而使用接口
// 在調用處添加如下代碼
HINSTANCE hDll;
hDll = LoadLibrary(_T("module1.dll"));// 加載DLL庫文件,DLL名稱和路徑用自己的
if(hDll == NULL)
{
TRACE("/n/nload dll fail/n/n");
return;
}
typedef Interface*(*pExport)(void); // 定義指向導出函數的指針類型
pExport Get;
Get = (pExport)GetProcAddress(hDll,"Export");// 將指針指向函數首地址
if(Get == NULL)
{
TRACE("/n/nload address fail/n/n");
return;
}
Interface *t = Get();// 調用導出函數獲得抽象類指針
t->ShowMsg();// 通過該指針調用類成員函數
delete t; // 釋放DLL中生成的對象
FreeLibrary(hDll); //釋放庫句柄
出處:http://blog.csdn.net/maxttyl/article/details/1537023