• <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++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評!!?。?/p>

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

            公告

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

            常用鏈接

            留言簿(19)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 387837
            • 排名 - 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 有哪些導出的符號??梢栽?/span> 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 @王一偉 閱讀(1094) 評論(0)  編輯 收藏 引用 所屬分類: 4. C++
            久久久久久亚洲精品不卡| 久久亚洲AV成人无码国产| 久久精品国产第一区二区| 伊人久久大香线蕉无码麻豆| 无码人妻久久一区二区三区蜜桃| 国产精品一久久香蕉国产线看观看| 国产L精品国产亚洲区久久| 久久成人国产精品免费软件| 99久久婷婷国产一区二区| 99久久精品国产一区二区| 久久99精品久久久久久齐齐| 久久精品亚洲精品国产色婷 | 无码专区久久综合久中文字幕| 欧美综合天天夜夜久久| 亚洲国产精品无码久久一线 | 天天综合久久一二三区| 国产欧美久久一区二区| 日韩人妻无码精品久久久不卡| 思思久久99热免费精品6| 国产精品免费久久| 国产综合久久久久久鬼色| 亚洲精品乱码久久久久久自慰 | 国产精品对白刺激久久久| 久久99这里只有精品国产| 久久精品国产欧美日韩| 国产亚洲成人久久| 99久久精品费精品国产| 青青草国产精品久久久久| 久久国产乱子精品免费女| 久久99国产精品久久久| 国产精品99精品久久免费| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 伊人久久大香线蕉AV一区二区| 国产毛片久久久久久国产毛片| 一本色道久久88加勒比—综合| 久久精品aⅴ无码中文字字幕不卡| 99久久国产综合精品女同图片| 精品久久久久久国产| 久久久久亚洲AV无码网站| 久久人人爽人人爽人人片AV不| 久久精品人人做人人妻人人玩|