• <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>
            在建立的工程中添加lib.h及l(fā)ib.cpp文件,源代碼如下:

            /* 文件名:lib.h */

            #ifndef LIB_H

            #define LIB_H

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

            #endif


            /* 文件名:lib.cpp */

            #include "lib.h"

            int add(int x, int y)

            {

            return x + y;

            }

            分析上述代碼,dllTest工程中的lib.cpp文件與第2節(jié)靜態(tài)鏈接庫版本完全相同,不同在于lib.h對函數(shù)add的聲明前面添加了__declspec(dllexport)語句。這個語句的含義是聲明函數(shù)add為DLL的導(dǎo)出函數(shù)。DLL內(nèi)的函數(shù)分為兩種:

              (1)DLL導(dǎo)出函數(shù),可供應(yīng)用程序調(diào)用;

              (2) DLL內(nèi)部函數(shù),只能在DLL程序使用,應(yīng)用程序無法調(diào)用它們。

            與第2節(jié)對靜態(tài)鏈接庫的調(diào)用相似,我們也建立一個與DLL工程處于同一工作區(qū)的應(yīng)用工程dllCall,它調(diào)用DLL中的函數(shù)add,其源代碼如下:

            #include <stdio.h>

            #include <windows.h>

            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;

            }
            而應(yīng)用程序?qū)Ρ綝LL的調(diào)用和對第2節(jié)靜態(tài)鏈接庫的調(diào)用卻有較大差異,下面我們來逐一分析。

              首先,語句typedef int ( * lpAddFun)(int,int)定義了一個與add函數(shù)接受參數(shù)類型和返回值均相同的函數(shù)指針類型。隨后,在main函數(shù)中定義了lpAddFun的實例addFun;

              其次,在函數(shù)main中定義了一個DLL HINSTANCE句柄實例hDll,通過Win32 Api函數(shù)LoadLibrary動態(tài)加載了DLL模塊并將DLL模塊句柄賦給了hDll;

              再次,在函數(shù)main中通過Win32 Api函數(shù)GetProcAddress得到了所加載DLL模塊中函數(shù)add的地址并賦給了addFun。經(jīng)由函數(shù)指針addFun進行了對DLL中add函數(shù)的調(diào)用;

              最后,應(yīng)用工程使用完DLL后,在函數(shù)main中通過Win32 Api函數(shù)FreeLibrary釋放了已經(jīng)加載的DLL模塊。

              通過這個簡單的例子,我們獲知DLL定義和調(diào)用的一般概念:

              (1)DLL中需以某種特定的方式聲明導(dǎo)出函數(shù)(或變量、類);

              (2)應(yīng)用工程需以某種特定的方式調(diào)用DLL的導(dǎo)出函數(shù)(或變量、類)。

            Posted on 2005-11-25 17:58 艾凡赫 閱讀(944) 評論(1)  編輯 收藏 引用 所屬分類: DLL 技術(shù)

            Feedback

            # re: 非MFC DLL  回復(fù)  更多評論   

            2008-09-17 00:15 by 愛飯盒
            存在繼承時:

            #ifdef __DLL_BUILD
            class _declspec(dllexport) CA;
            #else
            class _declspec(dllimport) CA;
            #endif
            class CA
            {
            public:
            CA();
            };

            #ifdef __DLL_BUILD
            class _declspec(dllexport) CB;
            #else
            class _declspec(dllimport) CB;
            #endif
            class CB:public CA
            {
            public:
            CB();
            };

            久久成人18免费网站| 97精品久久天干天天天按摩| 久久久免费观成人影院| 久久精品一区二区影院| 久久久久国产精品人妻| 波多野结衣中文字幕久久| 88久久精品无码一区二区毛片 | 免费久久人人爽人人爽av| 热re99久久精品国99热| 精品水蜜桃久久久久久久| 成人综合久久精品色婷婷| 91精品国产综合久久婷婷| 久久本道久久综合伊人| 久久久久亚洲av无码专区导航| 国产激情久久久久影院| 亚洲αv久久久噜噜噜噜噜| 久久精品国产亚洲av瑜伽| 久久亚洲精品成人AV| 中文成人无码精品久久久不卡| 伊人久久大香线蕉影院95| 久久亚洲春色中文字幕久久久| 亚洲国产成人精品无码久久久久久综合 | 久久精品国产99国产精偷| 久久人妻无码中文字幕| 久久久久亚洲?V成人无码| 久久国产精品99精品国产987| 亚洲va国产va天堂va久久| 国产成人精品久久亚洲| 久久青青草原亚洲av无码app| 久久影院亚洲一区| 久久国产香蕉视频| 久久91精品综合国产首页| 777久久精品一区二区三区无码| 国产精品久久久久无码av| 久久精品国产清高在天天线| 久久久亚洲欧洲日产国码aⅴ | 国产精品欧美亚洲韩国日本久久| 一本色道久久HEZYO无码| 狠狠色丁香久久婷婷综合图片| 久久久国产一区二区三区| 久久精品国产精品亚洲艾草网美妙|