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

            醬壇子

            專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!!)

              C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
              66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

            公告

            王一偉 湖南商學院畢業 電子信息工程專業

            常用鏈接

            留言簿(19)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 388624
            • 排名 - 64

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            DLL(Dynamic Link Library),動態鏈接庫。

            1.關于__declspec(dllimport)和__declspec(dllexport)

            在一個DLL的編寫過程中,如果要使一個變量、一個函數或一個類能夠被外部程序調用,在函數聲明上加上__declspec(dllimport)關鍵字。

            例:

            引出一個變量:
            __declspec(dllexport) int iEx;

            引出一個函數:
            __declspec(dllexport) int fnEx( int i );

            引出一個類:
            class __declspec(dllexport) CClassEx
            {……};

            在外部程序引用DLL時,如果采用隱式調用的方法(關于隱式調用稍后討論),需要包含DLL文件相關的頭文件,這個頭文件用__declspec(dllimport)關鍵字指出了DLL導出的內容(實際上就是把原來的__declspec(dllexport)全部替換為__declspec(dllimport))。

            例:

            引入一個變量:
            __declspec(dllimport) int iEx;

            引入一個函數:
            __declspec(dllimport) int fnEx( int i );

            引入一個類:
            class __declspec(dllimport) CClassEx
            {……};

            為了提高程序可讀性,可以定義如下宏:
            #define DllImport __declspec(dllimport)
            #define DllExport __declspec(dllexport)
            以便使用。

            實際上一般定義如下宏:
            #ifdef MYDLL_EXPORTS

            #define MYDLL_API __declspec ( dllexport )

            #else

            #define MYDLL_API __declspec ( dllimport )

            #endif

            這樣,在源程序的實現文件中先定義 MYDLL_EXPORTS ,再包含這個頭文件;在外程序內,可以直接包含這個頭文件。這種方法可以實現一個文件多種用途。

            ? 2 .隱式調用和顯式調用

            隱式調用是最常用的一種調用方法。它需要原 DLL 文件、原頭文件和庫文件組成。在程序內要包含這個頭文件,并加入庫文件一同編譯。在程序啟動時會把所有隱式調用的 DLL 文件加載到內存。

            如果想在使用的時候才把 DLL 文件加入到內存的話,可以使用顯式調用。顯式調用只需要原 DLL 文件即可,但是使用時必須對知道這個 DLL 有哪些導出的符號。可以在 VS 的命令行方式下輸入“ depends ”命令來查看 DLL 信息。

            ? 示例:

            ? 隱式調用:

            #include "..\DllTest\DllTest.h"

            ……

            void CallDll( void )

            {

            ???? wchar_t wszBuf[ 32 ];

            ???? wsprintf( wszBuf, TEXT( "%d" ), fnDllTest( 9 ) ); //fnDllTest DLL文件導出的方法

            ???? wprintf( wszBuf );

            } ?

            顯式調用:

            void CallDll( void )

            {

            ???? typedef int (*ADDPROC)( int i );

            ???? ADDPROC Fn;

            ?

            ???? HINSTANCE hInst = LoadLibrary( L "DllTest.dll" );

            ???? if ( NULL == hInst )

            ???? {

            ???????? wprintf( L "Failed on load DLL." );

            ???????? return ;

            ???? }

            ???? Fn = ( ADDPROC )GetProcAddress( hInst, "fnDllTest" );

            ???? // 如果導出時使用的是_stdcall, 那么這里我們也應該使用(_stdcall ADDPROC)

            ???? if ( !Fn )

            ???? ???? wprintf( L "Failed on get Process Address." );

            ???? else

            ???? {

            ???????? int i;

            ???????? i = Fn( 9 );

            ???????? wchar_t wszBuf[ 32 ];

            ???????? wsprintf( wszBuf, L "%d" , i );

            ???????? wprintf( wszBuf );

            ???? }

            ???? FreeLibrary(hInst); // 釋放DLL

            ???? /*

            ???? ?* ADDRPROC Add = (ADDPROC)GetProcAddress(hInst, "add");

            ???? ?* 第而個參數也可以使用序號:

            ???? ?* MAKEINTRESOURCE(1) 代替函數名.

            ???? ?*/

            }

            3 .注意事項

            如果使用 C++ 編程,那么在程序編譯的時候會為變量名等符號重命為諸如“ ?fnDllTest@QAEAAV 0 形式調用便。針對問題可以導出符號 extern “C” ”修飾符,就可以保持原有名稱。但是導出的類名仍然是重命名后的名稱,要再研究研究。

            如果你使用MFC生成MFC DLL那么只要做如下定義就可以了class AFX_EXT_CLASS yourClass。

            posted on 2006-10-18 10:23 @王一偉 閱讀(1101) 評論(0)  編輯 收藏 引用 所屬分類: 4. C++
            久久婷婷五月综合97色直播| 伊人久久综合热线大杳蕉下载| 久久久人妻精品无码一区| 久久久久无码专区亚洲av| 久久综合久久美利坚合众国| 久久精品中文闷骚内射| 国内精品久久久久久不卡影院| 亚洲人成电影网站久久| 国产精品久久国产精麻豆99网站 | 久久综合九色综合网站| 狠狠色婷婷综合天天久久丁香| 久久国产精品一区| 久久久亚洲欧洲日产国码二区| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 亚洲国产天堂久久久久久| 国产国产成人精品久久| 久久人妻无码中文字幕| 国产精品九九久久免费视频 | 狠狠色丁香婷综合久久| 色欲av伊人久久大香线蕉影院| 国产日韩久久免费影院| 久久精品一区二区| 亚洲精品蜜桃久久久久久| 无码8090精品久久一区| 久久精品国产亚洲av瑜伽| 国产精品18久久久久久vr| 久久精品亚洲日本波多野结衣 | 九九99精品久久久久久| 久久国产精品77777| 久久精品99久久香蕉国产色戒| 亚洲性久久久影院| 亚洲午夜久久久| 伊人久久大香线焦AV综合影院| 久久无码国产专区精品| 国产精品久久久久久久app| 伊人久久大香线蕉无码麻豆| 亚洲国产综合久久天堂| 久久久久高潮综合影院| 日本人妻丰满熟妇久久久久久| 久久精品国产亚洲av麻豆色欲| 无码久久精品国产亚洲Av影片|