我愛我的家園!

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

           

          DLL 實踐說明 (DllMain的使用)

          DllMain的使用:
          DllMain函數是DLL模塊的默認入口點。當Windows加載DLL模塊時調用這一函數。系統首先調用全局對象的構造函數,然后調用全局函數 DLLMain。DLLMain函數不僅在將DLL鏈接加載到進程時被調用,在DLL模塊與進程分離時(以及其它時候)也被調用。下面是一個框架 DLLMain函數的例子。

          如果我們在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);
          }

          我簡單的測試一下輸出結果為:
          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加載和應用程序退出的使用都會調用該函數(DllMain)的哦, 是應用程序一上來就調用的,不是用到該函數時才調用的!

          好象有個問題:
          下面的話來源:http://waiguai.blogdriver.com/waiguai/989918.html
          采用隱式鏈接方式,程序員在建立一個DLL文件時,鏈接程序會自動生成一個與之對應的LIB導入文件。該文件包含了每一個DLL導出函數的符號名和可選的標識號,但是并不含有實際的代碼。LIB文件作為DLL的替代文件被編譯到應用程序項目中。當程序員通過靜態鏈接方式編譯生成應用程序時,應用程序中的調用函數與LIB文件中導出符號相匹配,這些符號或標識號進入到生成的EXE文件中。LIB文件中也包含了對應的DLL文件名(但不是完全的路徑名),鏈接程序將其存儲在EXE文件內部。當應用程序運行過程中需要加載DLL文件時,Windows根據這些信息發現并加載DLL,然后通過符號名或標識號實現對 DLL函數的動態鏈接。

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

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

          評論

          # re: DLL 實踐說明 (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 加載程序鎖內執行托管代碼。不要嘗試在 DllMain 或映像初始化函數內運行托管代碼,這樣做會導致應用程序掛起。


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

          Gmail:
          iamnortheastern@gmail.com

          謝謝  回復  更多評論   

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

          寫的很好.音樂更好.  回復  更多評論   

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

          請問這是什么曲?  回復  更多評論   

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

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

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

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

          導航

          統計

          公告

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

          常用鏈接

          留言簿(3)

          隨筆分類(5)

          隨筆檔案(9)

          文章分類(37)

          文章檔案(41)

          相冊

          語音技術

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 合山市| 宝鸡市| 铜山县| 涞源县| 平顺县| 安溪县| 永嘉县| 三明市| 谷城县| 山阴县| 留坝县| 沙洋县| 额尔古纳市| 五常市| 榕江县| 绩溪县| 尖扎县| 岱山县| 武冈市| 轮台县| 嵊州市| 醴陵市| 长白| 呼玛县| 三门峡市| 应用必备| 吉安县| 上思县| 海南省| 清涧县| 安康市| 甘洛县| 綦江县| 绥阳县| 双桥区| 东明县| 通化县| 石嘴山市| 龙川县| 南汇区| 大关县|