可欣
動態連線庫最大的特點就是能節省磁碟空間.當多個程序共享同乙個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檔...