久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

C語(yǔ)言第一個(gè)DLL程序

 昵稱34122805 2016-06-15

DLL 程序的入口函數(shù)是 DllMain(),,就像 DOS 程序的入口函數(shù)是 main(),、Win32 程序的入口函數(shù)是 WinMain() 一樣,。前面我們一直在講的就是DOS程序,。

DllMain() 函數(shù)的原型為:

  1. BOOL APIENTRY DllMain(
  2. HANDLE hModule,
  3. DWORD ul_reason_for_call,
  4. LPVOID lpReserved
  5. );
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved);
其中:
  • hModule 表示本DLL程序的句柄。
  • ul_reason_for_call 表示DLL當(dāng)前所處的狀態(tài),,例如DLL_PROCESS_ATTACH表示DLL剛剛被加載到一個(gè)進(jìn)程中,,DLL_PROCESS_DETACH表示DLL剛剛從一個(gè)進(jìn)程中卸載。
  • lpReserved 表示一個(gè)保留參數(shù),目前已經(jīng)很少使用,。

一個(gè)簡(jiǎn)單的DLL程序并不比 'Hello World' 程序難,,下面就開始介紹如何利用VC6.0創(chuàng)建DLL及其調(diào)用方式。

首先利用VC6.0新建一個(gè) Win32 Dynamic-Link Library 類型的工程,,工程取名為 dllDemo,,并選擇“An empty Dll project'選項(xiàng),即創(chuàng)建一個(gè)空的動(dòng)態(tài)鏈接庫(kù)工程,。然后,,為該工程添加 一個(gè)C源文件 main.c,并在其中編寫完成加法運(yùn)算和減法運(yùn)算的函數(shù),,代碼如下所示:
  1. #include // 也可以 #include
  2. #include
  3. _declspec(dllexport) int add(int a, int b){
  4. return a+b;
  5. }
  6. _declspec(dllexport)int sub(int a, int b){
  7. return a-b;
  8. }
  9. BOOL APIENTRY DllMain(
  10. HANDLE hModule,
  11. DWORD ul_reason_for_call,
  12. LPVOID lpReserved
  13. ){
  14. if(ul_reason_for_call == DLL_PROCESS_ATTACH){
  15. printf('Congratulations! DLL is loaded!');
  16. }
  17. }
#include // 也可以 #include #include _declspec(dllexport) int add(int a, int b){ return a+b;}_declspec(dllexport)int sub(int a, int b){ return a-b;}BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved){ if(ul_reason_for_call == DLL_PROCESS_ATTACH){ printf('Congratulations! DLL is loaded!'); }}
然后利用Build命令生成dllDemo這一動(dòng)態(tài)鏈接庫(kù)程序,。之后,在該工程的Debug目錄下,, 可以看到有一個(gè)dllDemo.dll文件,,這就是生成的動(dòng)態(tài)鏈接庫(kù)文件。

讀者要記住,,應(yīng)用程序如果想要訪問(wèn)某個(gè)DLL中的函數(shù),,那么該函數(shù)必須是已經(jīng)被導(dǎo)出的函數(shù)。為了導(dǎo)出一些函數(shù),,需要在函數(shù)前面添加標(biāo)識(shí)符_declspec(dllexport),。

為了查看一個(gè)DLL中有哪些導(dǎo)出函數(shù),可 以利用VC6.0提供的命令行工具Dumpbin來(lái)實(shí)現(xiàn),。

Dumpbin.exe文件位于VC6.0安裝目錄下的VC98\bin目錄下,。在該目錄下還有 一個(gè)批處理文件VCVARS32.bat,該文件的作用是用來(lái)建立VC6.0使用的環(huán)境信息,。如果讀者在其他目錄下無(wú)法執(zhí)行Dumpbin命令,,原因可能就是你的VC6.0安裝的環(huán)境信息被破壞了,那么可以運(yùn)行VCVARS32.bat這個(gè)批處理文件,,之后在其他目錄下,,就可以 執(zhí)行Dumpbin命令了。

注意:當(dāng)在命令行界面下執(zhí)行VCVARS32.bat文件后,,該文件所設(shè)置的環(huán)境信息只是在當(dāng)前命令行窗口生效,。如果關(guān)閉該窗口,并再次啟動(dòng)一個(gè)新的命令行窗口后,,仍需要運(yùn)行VCVARS32.bat文件,。

在命令行界面下,cd 到工程目錄下的debug目錄,,輸入dumpbin -exports dllDemo.dll 命令,,然后回車,,即可查看DLL中的導(dǎo)出函數(shù),如下圖:


注意紅色方框標(biāo)出的信息:
ordinal hint RVA name
1 0 00001005 add
2 1 0000100A sub

在這段信息中,,'ordinal' 列列出的信息 '1' 和 '2' 是導(dǎo)出函數(shù)的序號(hào),;'hint' 列列出的數(shù)字是提示碼,該信息不重要,;'RVA' 列列出的地址值是導(dǎo)出函數(shù)在DLL模塊中的位置,,也就是說(shuō),通過(guò)該地址值,,可以在DLL中找到它們,;最后一列 'name' 列出的是導(dǎo)出函數(shù)的名稱。

將 add 函數(shù)前面的 _declspec(dllexport) 標(biāo)識(shí)符去掉,,再次編譯 dllDemo 工程,,然后執(zhí)行dumpbin -exports dllDemo.dll 命令,輸出如下圖所示:


可以看到,,add 函數(shù)已經(jīng)不是導(dǎo)出函數(shù)了,。

打開項(xiàng)目目錄下的Debug目錄,發(fā)現(xiàn)有 dllDemo.dll 和 dllDemo.lib 兩個(gè)文件,。上節(jié)已經(jīng)說(shuō)過(guò),,.lib 文件包含DLL導(dǎo)出的函數(shù)和變量的符號(hào)名,.dll 文件才包含實(shí)際的函數(shù)和數(shù)據(jù),。主程序調(diào)用 DLL 需要這兩個(gè)文件,,下節(jié)會(huì)講解如何使用。

注意:DllMain() 函數(shù)在DLL程序載入和卸載時(shí)執(zhí)行,,可以用來(lái)做一些初始化和清理的工作,,如果僅僅是向外暴露函數(shù),就可以省略 DllMain() 函數(shù),。但是如果有 DllMain() 函數(shù),,就一定要#include 或 #include

例如,,上面DLL如果只想暴露 add() 和 sub() 函數(shù),,而不想進(jìn)行其他操作,那么可以這樣寫:
  1. _declspec(dllexport) int add(int a, int b){
  2. return a+b;
  3. }
  4. _declspec(dllexport)int sub(int a, int b){
  5. return a-b;
  6. }

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多