顯式加載DLL並使用 DLL 中的類(轉)

首先需要強調,當使用某個類時一般目的有二:實例化成對象或者繼承它產生新類。
對於前者,我們可以構造一個抽象類(java裏的接口)來連接調用方和DLL。
 
抽象類:
// 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 
發佈了38 篇原創文章 · 獲贊 14 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章