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

            我參與的團隊

            搜索

            •  

            積分與排名

            • 積分 - 387109
            • 排名 - 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 @王一偉 閱讀(1088) 評論(0)  編輯 收藏 引用 所屬分類: 4. C++
            久久久久黑人强伦姧人妻| 青青热久久国产久精品 | 欧美久久一区二区三区| 久久这里有精品视频| 久久久久久久久波多野高潮| 影音先锋女人AV鲁色资源网久久| 久久99热只有频精品8| 久久99热这里只有精品国产| 狠狠综合久久综合88亚洲| 久久96国产精品久久久| 国产精品久久久久久久app| 久久99精品国产自在现线小黄鸭| 91精品国产91久久久久久| 亚洲精品无码久久久久去q | 久久久午夜精品福利内容| 久久久久久国产精品无码超碰| 国产精品无码久久久久| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 2021少妇久久久久久久久久| 久久综合久久伊人| 国内精品伊人久久久久AV影院| 亚洲欧美另类日本久久国产真实乱对白| 国内精品久久久久影院一蜜桃| 久久久久亚洲国产| 伊人伊成久久人综合网777| 久久99精品国产麻豆不卡| 久久婷婷五月综合色奶水99啪| 狠狠色综合网站久久久久久久高清 | 人人狠狠综合88综合久久| 欧美日韩中文字幕久久伊人| 精品一二三区久久aaa片| 久久这里的只有是精品23| 久久成人永久免费播放| 国产AV影片久久久久久| 久久r热这里有精品视频| 精品国产乱码久久久久久郑州公司| 亚洲午夜久久久| 97精品依人久久久大香线蕉97 | 亚洲Av无码国产情品久久| 久久精品国产精品亚洲人人| 久久久久久久99精品免费观看|