資源描述:
《c語(yǔ)言如何生成DLL文件.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、開(kāi)發(fā)環(huán)境是DEVC++,采用C語(yǔ)言編寫(xiě)?創(chuàng)建一個(gè)DLL項(xiàng)目,項(xiàng)目名稱hello,DLL編寫(xiě)采用的是DEVC++中的示例代碼頭文件dll.h#ifndef_DLL_H_?#define_DLL_H_#ifBUILDING_DLL?#defineDLLIMPORT__declspec (dllexport)#else/*NotBUILDING_DLL */?#defineDLLIMPORT__declspec(dllimport)?#endif /* NotBUILDING_DLL*/?DLLIMPORT voidHello
2、Wo(hù)rld?。ǎ鰋id);#endif /*_DLL_H_*/C文件?dllmain.c#include〈stdio。h>#include<stdlib.h>DLLIMPORT?。鰋id HelloWorld (){????MessageBox(0, ”Hello World?。鎟om DLL?。躰”, "Hi”, MB_ICONINFORMATION);}?BOOLAPIENTRY DllMain(HINSTANCEhInst????/*Libraryinstancehandle.*/,????????????????
3、????????。腤ORD reason???????/*Reasonthisfunctionisbeing called.?。?,???????????????????????LPVOIDreserved????/*Not used。*/){???switch(reason)????{?????caseDLL_PROCESS_ATTACH:????????break;?????caseDLL_PROCESS_DETACH:????????break;????? caseDLL_THREAD_ATTACH:???????
4、break;????? caseDLL_THREAD_DETACH:???????break;????}???/*ReturnsTRUE on success,FALSEon failure */???returnTRUE;?}?還有要注意的在.def文件中指定輸出的函數(shù),編譯生成了hello。dll文件DLL調(diào)用部分?dllcall.c#include<windows.h〉?#include〈stdio.h>?#include〈stdlib.h>HINSTANCEhDLL;//定義DLL包柄?typedefvoid (
5、*func)();???//定義函數(shù)指針原型?funchello;?//定義函數(shù)指針intmain()?{??if(hDLL ==NULL)???? hDLL=LoadLibrary(”hello.dll”);??//加載DLL?hello=(func)GetProcAddress(hDLL,"HelloWorld");//獲取函數(shù)指針?hello();?Free(cuò)Library(hDLL);?//釋放DLL??return0;?}編譯執(zhí)行?/*c語(yǔ)言調(diào)用dll里的函數(shù)-例子2之文件下載都5點(diǎn)了,還是睡不著,躺在床上想著該
6、做點(diǎn)撒,于是乎,開(kāi)始查找了下資料,大致弄清楚了c里怎么調(diào)用dll里的函數(shù),就寫(xiě)了個(gè)文件下載的例子,很簡(jiǎn)單,調(diào)用系統(tǒng)本身的UrlMon.dll里的URLDownloadToFileA函數(shù),之前的例子一是過(guò)程的調(diào)用,現(xiàn)在這個(gè)是函數(shù)的調(diào)用,都很簡(jiǎn)單。*/#include〈WINDOWS.H>?。nclude<WINBASE。H> typedefint(*MYFUNC)(PVOID,char*,char*,int,char*); /*函數(shù)原型*/intmain() { HINSTANCELibHandle; MYFUNCF
7、UNCADD; chardllbuf[]= "UrlMon.dll"; charsysbuf[] =”URLDownloadToFileA”;/*函數(shù)名*/ char*downfile= "http://www.baidu。com/img/logo—yy.gif”; /*過(guò)程要帶入的參數(shù)*/ char*savefile=”f:\c\baidu.gif"; LibHandle=LoadLibrary(dllbuf); /*載入dll*/ ?。疲誑CADD= (MYFUNC)GetPr
8、ocAddress( LibHandle,sysbuf); /*獲取函數(shù)sysbuf的地址*/ (FUNCADD) (NULL,downfile,savefile,0,NULL);/*FUNCADD就相當(dāng)于函數(shù) URLDownloadToFileA 后面是參數(shù)*/}