VC編寫DLL幾種方法的簡介

2021-04-13 11:03:29 字數 1852 閱讀 1558

可欣

動態連線庫最大的特點就是能節省磁碟空間.當多個程序共享同乙個dll的時候,記憶體中只有乙個dll的**.通過對映來使各個程序得以呼叫.

1.用vc建立乙個win32 dll

我們利用vc編寫dll有幾種方法.如果用vc建立乙個win32 dll 工程.那這個工程就應該只匯出c++的類或全域性變數.和全域性函式.方法就是在cpp檔案中編寫你的**,為每個需要匯出的元素進行匯出辦法是增加如下語句:

_declspec(dllexport)

你當然可以把它定義成巨集

例如,如果是乙個類student需要匯出, 那麼宣告時應該是這樣寫 class _declspec  // 宣告

之後就可以利用student來構造物件,也可以呼叫它的成員函式..了

記住,一定要把工程的連線設定好.要把生成的lib檔案填寫好,因為客戶程式要想載入dll,能夠準確的呼叫各個dll中的函式,都是靠這個lib檔案哪.包括函式的位址等等.

當然也可以顯示連線

利用loadlibrary

原型是

hmodule loadlibrary( lpctstr);

返回的hmodule就是乙個dll控制代碼.

所以我們在利用這個控制代碼來作為引數呼叫另乙個函式getprocaddress

farproc getprocaddress( hmodule  , lpcstr);//如果利用序號來索引,那麼要加上makeintersource巨集

返回乙個函式指標,利用它來呼叫函式,

lpcstr是函式名,但你應該利用dumpbin來檢視一下你匯出的函式名,因為c++編譯器支援過載,它會以自己的方式重新命名.除非你用extern "c"

用c語言的方式來命名函式.例如 乙個函式 void fun();

匯出格式應該是 extern "c" _declspec(dllexport) void fun();   //如果是宣告匯入函式,直接寫原型,如果是宣告類,那麼一定要是類的標頭檔案宣告,包含了成員函式和資料成員的.

注意即使是採用了c語言命名方式 如果你改變了呼叫方式_stdcall 那麼還是會改變函式命名的,除非你利用def檔案來匯出.

exports

fun這樣是可以的.

2.建立乙個mfc擴充套件dll

擴充套件dll是為了更好的支援mfc的類.你建立這個工程後會自動生成一些**,不要管它先,你把你要動態連線的cpp和相應的.h檔案加入到工程,在.cpp檔案中需要匯出的類上加上afx_ext_class 在.h需要匯入的類上加上同樣的**,這樣就可以了.

例如class afx_ext_class cstudent : public cperson   //.cpp

class afx_ext_class cstudent ; //.h

}   //宣告

3.建立乙個常規的dll

如果你要建立擴充套件的dll,那麼其他的ide是無法利用的,因為每個編譯器的命名方式是不同的.

如果你想使其他ide來呼叫vc的dll,那麼就建立乙個常規的dll.

建立工程以後,編寫你要匯出的類.例如

extern "c" _declspec(dllexport) void fun()

afx_manage_state(afxgetstaticmodulestate());

在為每乙個需要匯出的函式的開頭加上這條語句.

在客戶端要加上匯入語句就可以了.

**請註明位址

VC 使用 MinGW編寫的dll

參考文章 因為對ia32彙編格式不熟悉 所以寫了一些用c內嵌gnu彙編的 來獲取cpu的資訊,想用vc來做介面,c函式用mingw在windows平台編譯,完事遇到乙個問題,gcc編譯出來的dll檔案vc無法識別,於是昨天晚上和今天下午都在查詢資料,下面是我整理來的,不知道這樣用合不合適啊,不合適你...

VC 編寫 stdcall 方式的DLL

vc工具 vs2005 delphi 工具 delphi 7 vs2005 新建dll 新建 專案 儲存時選擇 dll testdll.cpp 定義 dll 應用程式的入口點。include stdafx.h ifdef managed pragma managed push,off endif b...

DLL的編寫方法

以add 函式為例 一 建testdll 1 在標頭檔案testdll.h中 ifdef dll api else define dll api extern c declspec dllimport endif dll api int add int a,int b 2 在testdll.cpp檔...