• <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>
            動(dòng)態(tài)調(diào)用
            typedef int(*lpAddFun)(int, int); //宏定義函數(shù)指針類型

            int main(int argc, char *argv[])

            {

            HINSTANCE hDll; //DLL句柄

            lpAddFun addFun; //函數(shù)指針

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

            if (hDll != NULL)

            {

            addFun = (lpAddFun)GetProcAddress(hDll, "add");

            if (addFun != NULL)

            {

            int result = addFun(2, 3);

            printf("%d", result);

            }

            FreeLibrary(hDll);

            }

            return 0;

            }
              在上邊的例子中我們看到了由“LoadLibrary-GetProcAddress-FreeLibrary”系統(tǒng)Api提供的三位一體“DLL加載-DLL函數(shù)地址獲取-DLL釋放”方式,這種調(diào)用方式稱為DLL的動(dòng)態(tài)調(diào)用。

              動(dòng)態(tài)調(diào)用方式的特點(diǎn)是完全由編程者用 API 函數(shù)加載和卸載 DLL,程序員可以決定 DLL 文件何時(shí)加載或不加載,顯式鏈接在運(yùn)行時(shí)決定加載哪個(gè) DLL 文件。

              與動(dòng)態(tài)調(diào)用方式相對(duì)應(yīng)的就是靜態(tài)調(diào)用方式,“有動(dòng)必有靜”,這來(lái)源于物質(zhì)世界的對(duì)立統(tǒng)一。“動(dòng)與靜”,其對(duì)立與統(tǒng)一竟無(wú)數(shù)次在技術(shù)領(lǐng)域里得到驗(yàn)證,譬如靜態(tài)IP與DHCP、靜態(tài)路由與動(dòng)態(tài)路由等。從前文我們已經(jīng)知道,庫(kù)也分為靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)DLL,而想不到,深入到DLL內(nèi)部,其調(diào)用方式也分為靜態(tài)與動(dòng)態(tài)。“動(dòng)與靜”,無(wú)處不在。《周易》已認(rèn)識(shí)到有動(dòng)必有靜的動(dòng)靜平衡觀,《易.系辭》曰:“動(dòng)靜有常,剛?cè)釘嘁印薄U軐W(xué)意味著一種普遍的真理,因此,我們經(jīng)常可以在枯燥的技術(shù)領(lǐng)域看到哲學(xué)的影子。

              靜態(tài)調(diào)用方式的特點(diǎn)是由編譯系統(tǒng)完成對(duì)DLL的加載和應(yīng)用程序結(jié)束時(shí) DLL 的卸載。當(dāng)調(diào)用某DLL的應(yīng)用程序結(jié)束時(shí),若系統(tǒng)中還有其它程序使用該 DLL,則Windows對(duì)DLL的應(yīng)用記錄減1,直到所有使用該DLL的程序都結(jié)束時(shí)才釋放它。靜態(tài)調(diào)用方式簡(jiǎn)單實(shí)用,但不如動(dòng)態(tài)調(diào)用方式靈活。

              下面我們來(lái)看看靜態(tài)調(diào)用的例子,將編譯dllTest工程所生成的.lib和.dll文件拷入dllCall工程所在的路徑,dllCall執(zhí)行下列代碼:

            #pragma comment(lib,"dllTest.lib")

            //.lib文件中僅僅是關(guān)于其對(duì)應(yīng)DLL文件中函數(shù)的重定位信息

            extern "C" __declspec(dllimport) add(int x,int y);

            int main(int argc, char* argv[])

            {

            int result = add(2,3);

            printf("%d",result);

            return 0;

            }


              由上述代碼可以看出,靜態(tài)調(diào)用方式的順利進(jìn)行需要完成兩個(gè)動(dòng)作

              (1)告訴編譯器與DLL相對(duì)應(yīng)的.lib文件所在的路徑及文件名,#pragma comment(lib,"dllTest.lib")就是起這個(gè)作用。

              程序員在建立一個(gè)DLL文件時(shí),連接器會(huì)自動(dòng)為其生成一個(gè)對(duì)應(yīng)的.lib文件,該文件包含了DLL 導(dǎo)出函數(shù)的符號(hào)名及序號(hào)(并不含有實(shí)際的代碼)。在應(yīng)用程序里,.lib文件將作為DLL的替代文件參與編譯。

              (2)聲明導(dǎo)入函數(shù),extern "C" __declspec(dllimport) add(int x,int y)語(yǔ)句中的__declspec(dllimport)發(fā)揮這個(gè)作用。

              靜態(tài)調(diào)用方式不再需要使用系統(tǒng)API來(lái)加載、卸載DLL以及獲取DLL中導(dǎo)出函數(shù)的地址。這是因?yàn)椋?dāng)程序員通過(guò)靜態(tài)鏈接方式編譯生成應(yīng)用程序時(shí),應(yīng)用程序中調(diào)用的與.lib文件中導(dǎo)出符號(hào)相匹配的函數(shù)符號(hào)將進(jìn)入到生成的EXE 文件中,.lib文件中所包含的與之對(duì)應(yīng)的DLL文件的文件名也被編譯器存儲(chǔ)在 EXE文件內(nèi)部。當(dāng)應(yīng)用程序運(yùn)行過(guò)程中需要加載DLL文件時(shí),Windows將根據(jù)這些信息發(fā)現(xiàn)并加載DLL,然后通過(guò)符號(hào)名實(shí)現(xiàn)對(duì)DLL 函數(shù)的動(dòng)態(tài)鏈接。這樣,EXE將能直接通過(guò)函數(shù)名調(diào)用DLL的輸出函數(shù),就象調(diào)用程序內(nèi)部的其他函數(shù)一樣。
            Posted on 2005-11-25 18:10 艾凡赫 閱讀(1121) 評(píng)論(0)  編輯 收藏 引用 所屬分類: DLL 技術(shù)
            日本免费久久久久久久网站| 综合久久给合久久狠狠狠97色 | 秋霞久久国产精品电影院| 999久久久无码国产精品| 中文精品久久久久国产网址| 久久久久久av无码免费看大片| 伊人色综合久久天天人守人婷| 性欧美大战久久久久久久久| 日本精品久久久中文字幕| 超级碰碰碰碰97久久久久| 久久婷婷久久一区二区三区| 综合久久国产九一剧情麻豆 | 少妇久久久久久被弄到高潮| 亚洲国产精品无码久久| 久久精品国产亚洲Aⅴ香蕉 | 久久精品国产69国产精品亚洲| 亚洲国产成人久久综合碰| 久久91精品国产91久久小草| 久久人做人爽一区二区三区| 久久99精品久久久久久噜噜| 999久久久免费精品国产| 无码人妻精品一区二区三区久久久| 久久久久国产精品麻豆AR影院 | MM131亚洲国产美女久久| 成人综合久久精品色婷婷| 久久国产香蕉一区精品| 狠狠色丁香婷综合久久| 久久精品无码专区免费青青| 久久天天躁狠狠躁夜夜躁2014| 久久精品成人免费观看97| 久久91精品综合国产首页| 好属妞这里只有精品久久| 国产一区二区三区久久精品| 国产成人精品久久一区二区三区| 久久久久99精品成人片直播| 日本欧美久久久久免费播放网| 亚洲va国产va天堂va久久| 午夜不卡久久精品无码免费| 久久精品国产久精国产思思| 久久国产乱子伦精品免费强| 久久精品国产福利国产秒|