• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            Windows在加載DLL的時(shí)候,需要一個(gè)入口函數(shù),就如同控制臺(tái)或DOS程序需要main函數(shù)、WIN32程序需要WinMain函數(shù)一樣。在前面的例子中,DLL并沒(méi)有提供DllMain函數(shù),應(yīng)用工程也能成功引用DLL,這是因?yàn)閃indows在找不到DllMain的時(shí)候,系統(tǒng)會(huì)從其它運(yùn)行庫(kù)中引入一個(gè)不做任何操作的缺省DllMain函數(shù)版本,并不意味著DLL可以放棄DllMain函數(shù)。

              根據(jù)編寫(xiě)規(guī)范,Windows必須查找并執(zhí)行DLL里的DllMain函數(shù)作為加載DLL的依據(jù),它使得DLL得以保留在內(nèi)存里。這個(gè)函數(shù)并不屬于導(dǎo)出函數(shù),而是DLL的內(nèi)部函數(shù)。這意味著不能直接在應(yīng)用工程中引用DllMain函數(shù),DllMain是自動(dòng)被調(diào)用的。

              我們來(lái)看一個(gè)DllMain函數(shù)的例子(單擊此處下載本工程附件)。

            BOOL APIENTRY DllMain( HANDLE hModule,

            DWORD ul_reason_for_call,

            LPVOID lpReserved

            )

            {

            switch (ul_reason_for_call)

            {

            case DLL_PROCESS_ATTACH:

            printf("\nprocess attach of dll");

            break;

            case DLL_THREAD_ATTACH:

            printf("\nthread attach of dll");

            break;

            case DLL_THREAD_DETACH:

            printf("\nthread detach of dll");

            break;

            case DLL_PROCESS_DETACH:

            printf("\nprocess detach of dll");

            break;

            }

            return TRUE;

            }


              DllMain函數(shù)在DLL被加載和卸載時(shí)被調(diào)用,在單個(gè)線(xiàn)程啟動(dòng)和終止時(shí),DLLMain函數(shù)也被調(diào)用,ul_reason_for_call指明了被調(diào)用的原因。原因共有4種,即PROCESS_ATTACH、PROCESS_DETACH、THREAD_ATTACH和THREAD_DETACH,以switch語(yǔ)句列出。
            來(lái)仔細(xì)解讀一下DllMain的函數(shù)頭BOOL APIENTRY DllMain( HANDLE hModule, WORD ul_reason_for_call, LPVOID lpReserved )。

              APIENTRY被定義為_(kāi)_stdcall,它意味著這個(gè)函數(shù)以標(biāo)準(zhǔn)Pascal的方式進(jìn)行調(diào)用,也就是WINAPI方式;

              進(jìn)程中的每個(gè)DLL模塊被全局唯一的32字節(jié)的HINSTANCE句柄標(biāo)識(shí),只有在特定的進(jìn)程內(nèi)部有效,句柄代表了DLL模塊在進(jìn)程虛擬空間中的起始地址。在Win32中,HINSTANCE和HMODULE的值是相同的,這兩種類(lèi)型可以替換使用,這就是函數(shù)參數(shù)hModule的來(lái)歷。

              執(zhí)行下列代碼:

            hDll = LoadLibrary("..\\Debug\\dllTest.dll");

            if (hDll != NULL)

            {

            addFun = (lpAddFun)GetProcAddress(hDll, MAKEINTRESOURCE(1));

            //MAKEINTRESOURCE直接使用導(dǎo)出文件中的序號(hào)

            if (addFun != NULL)

            {

            int result = addFun(2, 3);

            printf("\ncall add in dll:%d", result);

            }

            FreeLibrary(hDll);

            }



              我們看到輸出順序?yàn)椋?BR>
              process attach of dll

              call add in dll:5

              process detach of dll

              這一輸出順序驗(yàn)證了DllMain被調(diào)用的時(shí)機(jī)。

              代碼中的GetProcAddress ( hDll, MAKEINTRESOURCE ( 1 ) )值得留意,它直接通過(guò).def文件中為add函數(shù)指定的順序號(hào)訪(fǎng)問(wèn)add函數(shù),具體體現(xiàn)在MAKEINTRESOURCE ( 1 ),MAKEINTRESOURCE是一個(gè)通過(guò)序號(hào)獲取函數(shù)名的宏,定義為(節(jié)選自winuser.h):

            #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))

            #define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))

            #ifdef UNICODE

            #define MAKEINTRESOURCE MAKEINTRESOURCEW

            #else

            #define MAKEINTRESOURCE MAKEINTRESOURCEA

            Posted on 2005-11-25 18:12 艾凡赫 閱讀(7640) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): DLL 技術(shù)
            色婷婷久久久SWAG精品| 国产色综合久久无码有码| 国产精品久久久久9999| 精品国产一区二区三区久久久狼| 亚洲AV无码久久精品狠狠爱浪潮| 久久超乳爆乳中文字幕| 久久综合五月丁香久久激情| 77777亚洲午夜久久多喷| 国产国产成人久久精品| 亚洲精品乱码久久久久久 | a级毛片无码兔费真人久久| 亚洲一区精品伊人久久伊人| 久久久久久人妻无码| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 国产精品内射久久久久欢欢| 日本人妻丰满熟妇久久久久久| 免费精品久久久久久中文字幕| aaa级精品久久久国产片| 久久人人爽人人人人片av| 久久99国产精品成人欧美| 狠狠色丁香久久综合婷婷| av色综合久久天堂av色综合在| 久久99久久无码毛片一区二区 | 久久久久亚洲AV成人网人人软件| 久久久久久精品免费看SSS | 久久精品国产亚洲av日韩| 久久亚洲AV无码西西人体| 国产美女久久久| 久久精品亚洲精品国产色婷| 怡红院日本一道日本久久| 久久综合亚洲欧美成人| 欧美日韩精品久久免费| 色诱久久av| 亚洲AⅤ优女AV综合久久久| 久久久久这里只有精品| 久久香蕉国产线看观看猫咪?v| 99久久精品国产一区二区蜜芽| 久久免费国产精品一区二区| 国产成人久久精品区一区二区| 人妻无码αv中文字幕久久琪琪布| 国产A三级久久精品|