天天看點

C++技巧(用DEF檔案從DLL中導出C++類)

用DEF從DLL導出一個函數,或用__declspec(dlleXPort)指令從DLL中導出一類,想必大家已經很熟悉了,也經常使用着。這裡向大家介紹一種用DEF檔案從DLL導出一個類的方法。具體原理或為什麼就不廢話了,學會導出後,再慢慢回味吧。這裡主要叙述操作步驟。

1.打開VC6.0,建立一個"Win32 Dynamic-Link Library"工程,假設叫DefClass,在“Dll kind”選擇界面中選擇“A simple dll project”

2.建立一個檔案,命名為DefClass.def,先暫時輸入下面的内容,并加入工程。

LIBRARY DefClass

EXPORTS

3.向工程中加入一個類CMath,并添加一個Add方法,使之看起來如下: class CMath

;

它的實作,你想如何由你決定,我做例子時,Add傳回return a+b;

4.打開工程的設定(settings)界面,選擇Link,勾選Generate mapfile.

5.Rebuild all工程。

6.在VC中打開Debug或Release的.map檔案(假如你工程名這DefClass,那就是DelClass.map)。

7.找到Math.obj,比如: 0001:00000080 0CMath@@[email protected] 10001080 f Math.obj

0001:000000c0 _ECMath@@[email protected] 100010c0 f i Math.obj

0001:000000c0 _GCMath@@[email protected] 100010c0 f i Math.obj

0001:00000130 1CMath@@[email protected] 10001130 f Math.obj

0001:00000170 [email protected]@@[email protected] 10001170 f Math.obj

8.把1,4,5行的第2列拷貝到DefClass.Def檔案中,使之成為下面的樣子(序号自己指定) LIBRARY DefClass

EXPORTS

0CMath@@[email protected] @1

1CMath@@[email protected] @2

[email protected]@@[email protected] @3

9.儲存所有檔案,再執行Rebuild All.

假如一切正常,那你的DLL中的類已經以序号導出的了。這時再往CMath中加函數,如上從map檔案中找到函數的辨別符,并在def檔案中加一項,配置設定一個序号給它。隻要保持以前的導出序号不變,用新編譯生成的DLL替換先前的DLL,以前的客戶程式仍然可以正常運作。

如何使用生成的DLL?

你可以把"Math.h"和"DefClass.lib"拷貝到客戶程式的工程目錄下,把"DefClass.dll"拷貝到客戶程式的輸出(debug/release)目錄下。 在客戶程式中#include "Math.h",在客戶程式的settings中加入對DefClass.lib引用。

CMath Math;

int nRet=Math.Add(2,3);