動(dòng)態(tài)鏈接庫(kù)DLL同靜態(tài)Lib鏈接的區(qū)別在于:程序在編譯成可執(zhí)行文件時(shí)會(huì)把靜態(tài)鏈接庫(kù)中的程序拷進(jìn)可執(zhí)行文件中,所以Lib文件是不用同可執(zhí)行 文件一同發(fā)布的。而鏈接到動(dòng)態(tài)庫(kù)DLL中時(shí)要通過(guò)一個(gè)Lib文件,Lib文件保存了函數(shù)或類在DLL中的入口地址,可執(zhí)行文件中相應(yīng)存放的也是函數(shù)地址, 所以DLL和Lib要同可執(zhí)行文件一起發(fā)布。
1. VC中支持的DLL種類:Non MFC DLL,Regular DLL,Exetension DLL
Non MFC DLL 非MFC動(dòng)態(tài)鏈接庫(kù):不使用MFC類庫(kù)結(jié)構(gòu),直接用C寫(xiě),輸出函數(shù)用標(biāo)準(zhǔn)C接口,能被非MFC程序調(diào)用
Regular DLL 正則動(dòng)態(tài)鏈接庫(kù):使用MFC編寫(xiě),源文件中有繼承自CWinApp的類,只能被MFC調(diào)用;正則Dll又分成靜態(tài)連接到MFC的和動(dòng)態(tài)鏈接到MFC的,在創(chuàng)建時(shí)會(huì)看到。
Extension DLL 擴(kuò)展動(dòng)態(tài)鏈接庫(kù):實(shí)現(xiàn)從MFC繼承下來(lái)的新類,輸出MFC新子類,只能被MFC調(diào)用
2.實(shí)例如下:(VC++6.0)
在新建菜單中選擇新建工程Win32 Dynamic Link Library,選擇任何一種都可以,我以empty project為例,加入自己的函數(shù)MyFunction:
- #include <iostream>
- using namespace std;
-
- extern "C" _declspec(dllexport) int MyFunction();
- BOOL APIENTRY DllMain( HANDLE hModule,
- DWORD ul_reason_for_call,
- LPVOID lpReserved
- )
- {
- switch (ul_reason_for_call)//調(diào)用原因
- {
- case DLL_PROCESS_ATTACH://進(jìn)程被調(diào)用
- cout << "process attach!" << endl;
- break;
- case DLL_THREAD_ATTACH://線程被調(diào)用
- cout << "thread attach!" << endl;
- break;
- case DLL_THREAD_DETACH://進(jìn)程被停止
- cout << "thread detach!" << endl;
- break;
- case DLL_PROCESS_DETACH://線程被停止
- cout << "process detach!" << endl;
- break;
- }
- return TRUE;
-
- }
- int MyFunction()//自定函數(shù)
- {
- return 8;
- }
編譯后即可生成DLL文件和相應(yīng)的Lib文件
調(diào)用DLL的方法:顯式調(diào)用 隱式調(diào)用
顯調(diào):用LoadLibrary或AfxLoadLibrary顯式調(diào)入Dll,再用GetProcAddress引入函數(shù),最后用FreeLibrary或AfxFreeLibrary(參數(shù)是AfxLoadLibrary返回的句柄)釋放Dll
隱調(diào):需要加入動(dòng)態(tài)鏈接庫(kù)Lib文件,不需要調(diào)用LoadLibrayr或AfxLoadLibrary
在同一個(gè)工作區(qū)中,添加一個(gè)testdll工程,建立一個(gè)控制臺(tái)的程序做的測(cè)試。。
- #include "stdafx.h"
- #include <stdio.h>
- #pragma comment(lib,"mydll.lib") //引入Dll.lib,也可在設(shè)置中l(wèi)ink
- extern "C" _declspec(dllimport) int MyFunction();//導(dǎo)入MyFunction,也可放在頭文件中,如果dll中有加extern,導(dǎo)入時(shí)也要加extern
-
- int main(int argc, char* argv[])
- {
- int result=MyFunction();
- printf("The number is %d /r/n",result);
- return 0;
-
- }
測(cè)試代碼如上所寫(xiě)。
設(shè)置testdll工程為當(dāng)前活動(dòng)工程,在mydll工程的函數(shù)里面,添加一個(gè)斷點(diǎn)F9,
在調(diào)試時(shí),就能進(jìn)入到dll中單步跟蹤了!
以上內(nèi)容如有不懂,可以留言!中間如果有錯(cuò)歡迎大家指出來(lái)! 轉(zhuǎn)自:http://blog.csdn.net/shen_001/article/details/5616376
|