• <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++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
              66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

            公告

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

            常用鏈接

            留言簿(19)

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 387834
            • 排名 - 64

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

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

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

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

            例:

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

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

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

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

            例:

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

            引入一個函數(shù):
            __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

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

            ? 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");

            ???? ?* 第而個參數(shù)也可以使用序號:

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

            ???? ?*/

            }

            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区| 亚洲AV日韩AV天堂久久| 国产激情久久久久久熟女老人| 伊人久久大香线蕉综合热线| 波多野结衣AV无码久久一区| 69久久精品无码一区二区| 国产成人精品久久一区二区三区av | 亚洲欧美成人久久综合中文网| 国产成人精品综合久久久久| 久久综合给合久久狠狠狠97色69| 国产精品久久99| 要久久爱在线免费观看| 99久久综合狠狠综合久久止| 久久久久无码中| 国内精品久久久久| 久久受www免费人成_看片中文| 99国产欧美精品久久久蜜芽| 人人狠狠综合久久亚洲| 国产91色综合久久免费| 少妇人妻综合久久中文字幕| 精品九九久久国内精品| 99久久精品免费看国产一区二区三区| 9999国产精品欧美久久久久久 | 欧美牲交A欧牲交aⅴ久久| 久久中文字幕无码专区| 99久久er这里只有精品18| 亚洲国产视频久久| 久久99精品久久久久久噜噜| 久久99国产精品尤物| 久久精品国产清自在天天线| 久久久久九九精品影院| 久久亚洲国产午夜精品理论片| 囯产极品美女高潮无套久久久| 亚洲?V乱码久久精品蜜桃| 国产午夜电影久久| 久久线看观看精品香蕉国产| 97久久超碰国产精品2021| 亚洲中文字幕无码久久2017 |