我愛我的家園!

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

           

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

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

          如果我們在DllMain中寫入下面的代碼(在原來的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);
          }

          同時將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);
          }

          我簡單的測試一下輸出結(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)用程序退出的使用都會調(diào)用該函數(shù)(DllMain)的哦, 是應(yīng)用程序一上來就調(diào)用的,不是用到該函數(shù)時才調(diào)用的!

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

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

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

          評論

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

          檢測到 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)行托管代碼,這樣做會導(dǎo)致應(yīng)用程序掛起。


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

          Gmail:
          iamnortheastern@gmail.com

          謝謝  回復(fù)  更多評論   

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

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

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

          請問這是什么曲?  回復(fù)  更多評論   

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

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

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

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

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          歡迎大家來到我的個人世界!

          常用鏈接

          留言簿(3)

          隨筆分類(5)

          隨筆檔案(9)

          文章分類(37)

          文章檔案(41)

          相冊

          語音技術(shù)

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 海安县| 曲阳县| 南部县| 漯河市| 广饶县| 庄浪县| 黄骅市| 定州市| 乌拉特前旗| 辉县市| 屯昌县| 宜阳县| 壶关县| 时尚| 洛浦县| 江口县| 弋阳县| 永清县| 仁寿县| 河北省| 武隆县| 黄浦区| 天全县| 阿鲁科尔沁旗| 大埔区| 鞍山市| 醴陵市| 库车县| 法库县| 抚顺县| 姜堰市| 崇左市| 南华县| 吐鲁番市| 沅江市| 六安市| 十堰市| 嵊州市| 行唐县| 安塞县| 潮安县|