如何用vc編寫dll檔案

2021-09-30 06:28:04 字數 1859 閱讀 8388

如何用vc編寫dll檔案

動態連線庫最大的特點就是能節省磁碟空間.當多個程序共享同乙個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和相應的.**件加入到工程,在.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...

在VC裡如何用Makefile檔案編譯?

原文 執行cmd.exe or command.com in win9x 進到vc bin目錄 執行vc vars32.bat 進到makefile 所在的目錄 nmake f makefile 以下內容為程式 libjpeg.lib libobjects rm libjpeg.lib lib ou...