我愛我的家園!

          成功在于你是否努力,希望在于你是否相信自己!

           

          DLL 實(shí)踐說明 (DllMain的使用)

          DllMain的使用:
          DllMain函數(shù)是DLL模塊的默認(rèn)入口點(diǎn)。當(dāng)Windows加載DLL模塊時(shí)調(diào)用這一函數(shù)。系統(tǒng)首先調(diào)用全局對(duì)象的構(gòu)造函數(shù),然后調(diào)用全局函數(shù) DLLMain。DLLMain函數(shù)不僅在將DLL鏈接加載到進(jìn)程時(shí)被調(diào)用,在DLL模塊與進(jìn)程分離時(shí)(以及其它時(shí)候)也被調(diào)用。下面是一個(gè)框架 DLLMain函數(shù)的例子。

          如果我們?cè)贒llMain中寫入下面的代碼(在原來的gandll.c中添加下面的代碼):
          BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
          {
          ??? printf("hModule.%p lpReserved.%p \n", hModule, lpReserved);

          ??? switch (ul_reason_for_call)
          ??? {
          ??????? case DLL_PROCESS_ATTACH:
          ??????????? printf("Process attach. \n");
          ??????????? break;

          ??????? case DLL_PROCESS_DETACH:
          ??????????? printf("Process detach. \n");
          ??????????? break;

          ??????? case DLL_THREAD_ATTACH:
          ??????????? printf("Thread attach. \n");
          ??????????? break;

          ??????? case DLL_THREAD_DETACH:
          ??????????? printf("Thread detach. \n");
          ??????????? break;
          ??? }

          ??? return (TRUE);
          }

          同時(shí)將dlltest\dlltest.c修改為:
          #include <stdio.h>
          #include "dlltest.h"

          int main(int argc, char **argv)
          {
          ??? printf("Simple DLL test start. \n");

          ??? printf("Call DLL function: \n");
          ??? printf("Test DLL values: %d \n", add2(1, 2));
          ??? printf("Call DLL function end. \n");

          ??? printf("Simple DLL test end. \n");

          ??? return (0);
          }

          我簡單的測(cè)試一下輸出結(jié)果為:
          C:\gandll\dlltest>dlltest
          hModule.10000000 lpReserved.0012FD30
          Process attach.
          Simple DLL test start.
          Call DLL function:
          Test DLL values: 3
          Call DLL function end.
          Simple DLL test end.
          hModule.10000000 lpReserved.00000001
          Process detach.
          也就是說DLL加載和應(yīng)用程序退出的使用都會(huì)調(diào)用該函數(shù)(DllMain)的哦, 是應(yīng)用程序一上來就調(diào)用的,不是用到該函數(shù)時(shí)才調(diào)用的!

          好象有個(gè)問題:
          下面的話來源:http://waiguai.blogdriver.com/waiguai/989918.html
          采用隱式鏈接方式,程序員在建立一個(gè)DLL文件時(shí),鏈接程序會(huì)自動(dòng)生成一個(gè)與之對(duì)應(yīng)的LIB導(dǎo)入文件。該文件包含了每一個(gè)DLL導(dǎo)出函數(shù)的符號(hào)名和可選的標(biāo)識(shí)號(hào),但是并不含有實(shí)際的代碼。LIB文件作為DLL的替代文件被編譯到應(yīng)用程序項(xiàng)目中。當(dāng)程序員通過靜態(tài)鏈接方式編譯生成應(yīng)用程序時(shí),應(yīng)用程序中的調(diào)用函數(shù)與LIB文件中導(dǎo)出符號(hào)相匹配,這些符號(hào)或標(biāo)識(shí)號(hào)進(jìn)入到生成的EXE文件中。LIB文件中也包含了對(duì)應(yīng)的DLL文件名(但不是完全的路徑名),鏈接程序?qū)⑵浯鎯?chǔ)在EXE文件內(nèi)部。當(dāng)應(yīng)用程序運(yùn)行過程中需要加載DLL文件時(shí),Windows根據(jù)這些信息發(fā)現(xiàn)并加載DLL,然后通過符號(hào)名或標(biāo)識(shí)號(hào)實(shí)現(xiàn)對(duì) DLL函數(shù)的動(dòng)態(tài)鏈接。

          我們看他說的“當(dāng)應(yīng)用程序運(yùn)行過程中需要加載DLL文件時(shí)”, 我做的實(shí)驗(yàn)測(cè)試的是,在輸出
          Simple DLL test start.
          Call DLL function:
          這兩行應(yīng)該是不需要DLL的啊, 怎么應(yīng)用程序在前面輸出了:
          hModule.10000000 lpReserved.0012FD30
          Process attach.
          這個(gè)呢? 這就說明其實(shí)應(yīng)用程序一上來就調(diào)用了DLL的(還有一種可能就是他是正確的,由于編譯器優(yōu)化的原因使的該DLL一上來就被調(diào)用了)。
          到地是為什么? 再查,再查。。。。。。

          posted on 2008-02-25 16:11 死神 閱讀(7844) 評(píng)論(5)  編輯  收藏 所屬分類: Windows編程

          評(píng)論

          # re: DLL 實(shí)踐說明 (DllMain的使用) 2009-05-23 13:57 trypsin

          檢測(cè)到 LoaderLock
          Message: DLL“C:\WINDOWS\assembly\GAC\Microsoft.DirectX\1.0.2902.0__31bf3856ad364e35\Microsoft.DirectX.dll”正試圖在 OS 加載程序鎖內(nèi)執(zhí)行托管代碼。不要嘗試在 DllMain 或映像初始化函數(shù)內(nèi)運(yùn)行托管代碼,這樣做會(huì)導(dǎo)致應(yīng)用程序掛起。


          你好,我碰到了這樣的一個(gè)問題,我是編程新手,不知能不能幫我解釋一下上面的這個(gè)問題。

          Gmail:
          iamnortheastern@gmail.com

          謝謝  回復(fù)  更多評(píng)論   

          # re: DLL 實(shí)踐說明 (DllMain的使用) 2009-12-01 00:06 高翔

          寫的很好.音樂更好.  回復(fù)  更多評(píng)論   

          # re: DLL 實(shí)踐說明 (DllMain的使用) 2011-09-13 10:31 johnyabc

          請(qǐng)問這是什么曲?  回復(fù)  更多評(píng)論   

          # re: DLL 實(shí)踐說明 (DllMain的使用) 2011-09-13 10:32 johnyabc

          不錯(cuò)!這是什么鋼琴曲?  回復(fù)  更多評(píng)論   

          # re: DLL 實(shí)踐說明 (DllMain的使用) 2012-04-11 16:00 jackong

          路過...
          背景音樂:http://www.touchingchina.com/IMissYou.mp3  回復(fù)  更多評(píng)論   

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          歡迎大家來到我的個(gè)人世界!

          常用鏈接

          留言簿(3)

          隨筆分類(5)

          隨筆檔案(9)

          文章分類(37)

          文章檔案(41)

          相冊(cè)

          語音技術(shù)

          最新隨筆

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 荔浦县| 耒阳市| 中山市| 东乡县| 绥棱县| 凤庆县| 苍南县| 姚安县| 六安市| 南木林县| 太康县| 康马县| 景泰县| 北流市| 岑溪市| 姜堰市| 奉贤区| 砀山县| 渭南市| 祁门县| 华安县| 崇信县| 泉州市| 彭阳县| 虞城县| 通州区| 永兴县| 固安县| 龙川县| 社会| 博罗县| 宁波市| 盐边县| 广宗县| 菏泽市| 肇庆市| 梓潼县| 海南省| 琼结县| 永仁县| 华亭县|