• <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>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            DLL編程講解

            本文介紹一點(diǎn)關(guān)于DLL的基礎(chǔ)知識(shí),如果你是系統(tǒng)編程的高手就不要看了。
            先介紹些DLL的基礎(chǔ)知識(shí)。DLL(Dynamic Link Library:動(dòng)態(tài)鏈接庫)其實(shí)這個(gè)東西就是把一些經(jīng)常要用的代碼塊編譯完后放在磁盤上,當(dāng)有應(yīng)用程序需要其中的功能時(shí),就把DLL文件映射到自己的進(jìn)程空間中然后根據(jù)DLL中的輸出符號(hào)來加載其中的功能代碼,完成一定的功能。這就有點(diǎn)像C標(biāo)準(zhǔn)函數(shù)庫。
            這樣做的好處可用有以下幾點(diǎn)。
            1.節(jié)省了系統(tǒng)資源。
            2.一次編譯,多個(gè)進(jìn)程可用多次調(diào)用。
            3.就是一個(gè)應(yīng)用程序你可以用C++實(shí)現(xiàn),但C++實(shí)現(xiàn)的程序卻可用調(diào)用其他語言寫的DLL文件。

            下面介紹一下具體的DLL的編寫和調(diào)用。

            1.DLL的編寫其實(shí)很我們正常的應(yīng)用的程序的編寫基本上是差不多的。
            比如有一個(gè)功能函數(shù)是
            int Add(int nLeft ,int nRight)

                    g_nResult 
            = nLeft + nRight;

                    
            return  g_nResult;
            }
              

            我們可用把它寫入正常的應(yīng)用程序,也可用把它直接的寫如DLL文件中。

            2.DLL的調(diào)用,調(diào)用DLL文件有兩種方法一種是顯式的加載和隱式的加載。

            下面先來看看隱示的加載DLL。
            (需要兩個(gè)文件一個(gè)DLL.DLL,另一個(gè)是install.exe)

            我們先來建立一個(gè)名為mydll的DLL工程,我用的是VC 6.0。
            新件工程->WIN32 Dynamic Link Library。不要選擇MFC的DLL工程。
            然后選擇AN EMPTY DLL PROJECT,接下來一路OK。
            這樣我們就建立了一個(gè)空的DLL工程了。
            接下在其中建立mydll.dll和mydll.h文件。
            寫下如下代碼:
            //
            //mydll.h
            //首先必須創(chuàng)建一個(gè)頭文件,它包含你想要從DLL輸出的函數(shù)原型、結(jié)構(gòu)和符號(hào)。
            //
            //DLL的所有源代碼模塊均包含該頭文件,以幫助創(chuàng)建DLL。

            #ifdef MYLIBAPI

            #else

            #define MYLIBAPI extern"C" __declspec(dllimport)
            //這個(gè)地方是為了,不改變DLL在被進(jìn)行C++編譯時(shí)改變各種符號(hào)

            #endif

            //變量和函數(shù)的聲明
            MYLIBAPI int g_nResult;

            MYLIBAPI
            int Add(int nLeft, int nRight);
            //---------------------------the end-------------------------


            //
            //mydll.cpp
            //
            #include <windows.h>
            #include
            "mydll.h"

            #define MYLIBAPI extern "C" __declspec(dllexport)

            //函數(shù)和變量的具體定義

            int g_nResult;

            int Add(int nLeft ,int nRight)
            {
            g_nResult
            = nLeft + nRight;

            return g_nResult;
            }


            //-----------------------the end---------------------------------

            編譯這個(gè)工程,就可用得到DLL.DLL文件了。




            然后建立一個(gè)明為“install”的控制臺(tái)工程,在其中建立install.cpp和install.h兩個(gè)文件。
            寫入如下代碼:
            //
            //install.h
            //
            //其實(shí)這個(gè)文件和前面的DLL工程里面的mydll.h文件的是一樣的

            #ifdef MYLIBAPI

            #else

            #define MYLIBAPI extern"C" __declspec(dllimport)
            //這個(gè)地方是為了,不改變DLL在被進(jìn)行C++編譯時(shí)改變各種符號(hào)

            #endif

            //變量和函數(shù)的聲明
            MYLIBAPI int g_nResult;

            MYLIBAPI
            int Add(int nLeft, int nRight);
            //---------------------------the end-------------------------

            //
            //install.cpp
            //
            //這個(gè)文件是調(diào)用DLL內(nèi)提供的函數(shù)的,應(yīng)用程序。
            //
            //這個(gè)調(diào)用方式是一中“隱式的調(diào)用”,這種方是從系統(tǒng)默認(rèn)的幾個(gè)路徑去找,DLL文件。
            //缺少了程序的靈活性
            //
            #include <windows.h>
            #include
            "install.h"

            #pragma comment(lib,
            "mydll.lib")
            //這個(gè)LIB文件是編譯DLL時(shí)產(chǎn)生的,在DLL工程的DEBUG文件夾里可用找到。
            //mydll.lib里面是DLL文件對外輸出的接口符號(hào)

            int main()
            {
            int nLeft =10,nRight = 25;

            TCHAR sz[
            100];
            wsprintf(sz,TEXT(
            "%d + %d = %d"),nLeft, nRight,Add(nLeft,nRight));
            MessageBox (NULL,sz, TEXT(
            "Last Result"),MB_OK);

            wsprintf(sz,TEXT(
            "GXTER:%d"), g_nResult);
            MessageBox(NULL,sz,TEXT(
            "GXTER"),MB_OK);

            return 0;
            }

            //------------------------the end--------------------
            編譯后就可用得到install.exe文件了。

            然后把mydll.dll和install.exe放在一起就可以,運(yùn)行install.exe就可以看到調(diào)用DLL的函數(shù)的效果。
            順便說一下隱式加載DLL的默認(rèn)路徑
            1) 包含可執(zhí)行映像文件的目錄。
            2) 進(jìn)程的當(dāng)前目錄。
            3) Wi n d o w s系統(tǒng)目錄。
            4) Wi n d o w s目錄。
            5) PAT H環(huán)境變量中列出的各個(gè)目錄。

            下面先來看看顯式的加載DLL。
            (需要如下兩個(gè)文件in.exe和dl.dll)

            建立一個(gè)名為dl的DLL工程,然后新建dl.cpp文件代碼如下:
            //
            //dl.cpp
            //
            #include <windows.h>
            #include
            <stdio.h>

            int my_fun();

            BOOL WINAPI DllMain(HINSTANCE histdll,
            //
            DWORD fdw, //系統(tǒng)調(diào)用/卸載時(shí)傳遞的消息
            PVOID fim) //傳進(jìn)DLLMAIN內(nèi)的參數(shù)
            {
            switch(fdw)
            {
            case DLL_PROCESS_ATTACH: //當(dāng)系統(tǒng)加載一個(gè)這個(gè)DLL文件時(shí)就會(huì)給出這消息
            my_fun(); //然后會(huì)執(zhí)行my_fun()函數(shù)
            break;

            case DLL_THREAD_ATTACH:
            break;
            case DLL_THREAD_DETACH:
            break;
            case DLL_PROCESS_DETACH:
            break;
            }


            return 1; //發(fā)現(xiàn)的一個(gè)問題就,這個(gè)返回值一定要為1,不能為0。
            //不然就會(huì)出現(xiàn)一個(gè)問題,DLL被加載,但LoadLibrary(dll_path);
            //這個(gè)函數(shù)會(huì)返回NULL。錯(cuò)誤代碼為1114(系統(tǒng)加載DLL文件失敗)。
            }


            int my_fun()
            {
            printf(
            "這里填加功能函數(shù)代碼!");

            return 0;
            }

            //------------------------the end------------------------------
            編譯得到dl.dll文件

            新建一個(gè)名為“in”控制臺(tái)工程,然后建立一個(gè) in.cpp
            //
            //in.cpp
            //
            #include <windows.h>
            #include
            <stdio.h>

            int main()
            {
            int error;
            char exe_path[512] ="\0";
            HINSTANCE hdll_lib;
            char * dll_path ="dl.dll"; //dll文件的路徑

            //加載一個(gè)DLL
            hdll_lib = LoadLibrary(dll_path);
            if(hdll_lib == NULL)
            {
            error
            = GetLastError();
            printf(
            "error = %d",error);
            }


            //獲得正在運(yùn)行的程序的路徑 + 文件名,前提是獲得了這個(gè)程序的句柄
            GetModuleFileName(hdll_lib,exe_path,sizeof(exe_path));
            printf(
            "\n%s\n",exe_path);

            //顯式的加載一個(gè)DLL的輸出符號(hào)。
            //GetProcAddress(hdll_lib , "my_fun");

            //判斷是否加載了某個(gè)DLL
            hdll_lib = GetModuleHandle(dll_path);
            if(hdll_lib == NULL)
            {
            printf(
            "lksjdflkjsf");
            hdll_lib
            = LoadLibrary(dll_path);
            }


            //卸載一個(gè)DLL
            FreeLibrary(hdll_lib);

            getchar();
            return 0;
            }

            //--------------------------the end-------------------------

            編譯后得到in.exe文件

            然后把得到的in.exe和dl.dll文件放在同一目錄下。運(yùn)行in.exe就可用看到顯式加載DLL的效果。


            本問只涉及到了DLL編程的基礎(chǔ)部分,一些深入的概念都沒有具體的講解. 如有錯(cuò)誤還請通過E-MAIL告訴我。
            以后會(huì)講些DLL編程的高級部分。


            By Gxter
            http://www.safechina.net
            Gxter at sogou dot com

            參考:
            MSDN 2000版
            《WINDOWS 核心編程》

            posted on 2006-05-08 17:51 楊粼波 閱讀(505) 評論(0)  編輯 收藏 引用 所屬分類: 文章收藏

            亚洲第一永久AV网站久久精品男人的天堂AV | 久久丝袜精品中文字幕| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 色婷婷噜噜久久国产精品12p| 久久精品夜色噜噜亚洲A∨| 天堂久久天堂AV色综合| 国产精品免费久久久久影院| 99精品久久久久久久婷婷| 国产69精品久久久久9999| 久久激情五月丁香伊人| 亚洲国产精品综合久久网络| 久久人人爽人人爽人人片AV高清| 久久狠狠色狠狠色综合| 99久久这里只精品国产免费| 91精品国产高清久久久久久国产嫩草| 亚洲中文字幕久久精品无码APP| 人妻少妇久久中文字幕| 久久精品国产亚洲AV忘忧草18| 人妻久久久一区二区三区| 香蕉久久一区二区不卡无毒影院 | 久久久久人妻一区二区三区| 久久99精品久久久久久hb无码 | 亚洲国产精品久久| 伊人久久精品影院| 99久久成人国产精品免费| 无码精品久久久天天影视 | 久久久久AV综合网成人| 欧洲成人午夜精品无码区久久| 99久久无码一区人妻| 久久国产亚洲高清观看| 久久久久人妻一区精品| 久久er国产精品免费观看2| 久久精品国产亚洲AV蜜臀色欲| 亚洲嫩草影院久久精品| 久久亚洲美女精品国产精品| 99久久99久久精品国产| 久久婷婷五月综合色高清| 精品伊人久久久| 久久久精品国产亚洲成人满18免费网站| 久久青青草原亚洲av无码app| 香港aa三级久久三级老师2021国产三级精品三级在|