• <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>
            總結(jié)下C++中模塊(Dll)對(duì)外暴露接口的方式:

            (1)導(dǎo)出API函數(shù)的方式

            這種方式是Windows中調(diào)用DLL接口的最基本方式,GDI32.dll, User32.dll都是用這種方式對(duì)外暴露系統(tǒng)API的。
            這種方式的優(yōu)點(diǎn)是導(dǎo)出函數(shù)沒有語(yǔ)言限制,什么語(yǔ)言都能調(diào)用;
            缺點(diǎn)是這種方式是面向過(guò)程的,外部如果要支持多實(shí)例等不是很方便,另外它要求的回調(diào)函數(shù)(callback)只能是普通C函數(shù),C++中我們通常用類靜態(tài)成員函數(shù),很不方便。
            當(dāng)然,我們通過(guò)封裝其實(shí)也可以讓這種方式支持多實(shí)例,通過(guò)一個(gè)抽象句柄HComponent, 比如支持導(dǎo)出函數(shù)HComponent CreateInstance(); VOID DeleteInstance(HComponent h);然后內(nèi)部的其他導(dǎo)出函數(shù)的第一個(gè)參數(shù)都是實(shí)例句柄,類似INT SendMessage(HComponent h, ...), 用這種方式可以模擬出面向?qū)ο蟮男Ч?br />另外如果用動(dòng)態(tài)加載(LoadLibrary, GetProcAddress)的方式調(diào)用它的導(dǎo)出函數(shù),即使導(dǎo)出函數(shù)內(nèi)部實(shí)現(xiàn)修改了,外部程序也不用重新編譯,仍然可用。
            導(dǎo)出函數(shù)方式一個(gè)比較優(yōu)秀的例子是GDI+的實(shí)現(xiàn),整個(gè)GdiPlus.dll對(duì)外提供的都是普通導(dǎo)出函數(shù),但是它卻可以方便的給面向?qū)ο蟮恼Z(yǔ)言使用,因?yàn)橐环矫嫠肏andle的方式在DLL內(nèi)部封裝了對(duì)象,另一方面它在DLL外圍又用C++類的方式封裝了頭文件直接提供給用戶, 所以C++程序可以直接以面向?qū)ο蟮姆绞秸{(diào)用。

            (2)導(dǎo)出類方式
            導(dǎo)出類的方式就是把整個(gè)C++類對(duì)外導(dǎo)出, MFC42.dll就是這種方式。
            這種方式的優(yōu)點(diǎn)是直接面向?qū)ο蟆?br />缺點(diǎn)是只能給C++用,而且最好編譯器都要一致,另外DLL一變動(dòng), 外部程序需要重新編譯, 而且外部程序可以通過(guò)頭文件看到你類的內(nèi)部實(shí)現(xiàn),
            所以這種方式是最不建議使用的方式。

            (3)COM方式
            COM方式實(shí)際上導(dǎo)出了幾個(gè)固定函數(shù)(DllGetClassObject, DllCanUnloadNow, DllRegisterServer, DllUnregisterServer), 然后以這幾個(gè)函數(shù)為入口,調(diào)用組件內(nèi)部‘實(shí)現(xiàn)的接口。
            COM方式綜合了上面2種方法的所有優(yōu)點(diǎn),沒有語(yǔ)言限制,面向?qū)ο螅鄬?shí)例,只能看到接口,動(dòng)態(tài)升級(jí)等。
            當(dāng)然COM因?yàn)槠鋸?fù)雜性和對(duì)注冊(cè)表的依賴,很多時(shí)候我們?cè)诜庋b模塊時(shí)不愿意嚴(yán)格按照COM標(biāo)準(zhǔn)來(lái)實(shí)現(xiàn),但是我們可以按照COM思想來(lái)提供接口。
            比如我們可以讓我們模塊只提供一個(gè)導(dǎo)出函數(shù)CreateFactory, 然后外部可以調(diào)用該接口來(lái)創(chuàng)建工廠,最后通過(guò)工廠創(chuàng)建出各種類型的對(duì)象,這些對(duì)象實(shí)現(xiàn)了某些接口,外部只需要這些接口的頭文件即可調(diào)用對(duì)象的方法。
            現(xiàn)在越來(lái)越多的組件以這種方式對(duì)外提供接口,比如D2D對(duì)外的導(dǎo)出接口就是D2D1CreateFactory, 然后就可以通過(guò)該工廠來(lái)創(chuàng)建其他的對(duì)象,比如pD2DFactory->CreateHwndRenderTarget(...),最后可以直接調(diào)用對(duì)象實(shí)現(xiàn)的接口:pRenderTarget->DrawRectangle(D2D1::RectF(100.f, 100.f, 500.f, 500.f), pBlackBrush);

            當(dāng)然,上面幾種DLL對(duì)外暴露接口的方式本質(zhì)上沒有區(qū)別,都是利用PE文件的導(dǎo)出節(jié)來(lái)導(dǎo)出數(shù)據(jù)和函數(shù),但是根據(jù)它們使用方式的不同,對(duì)外部模塊來(lái)說(shuō)還是有很大的區(qū)別,我們的推薦次序依次是:COM方式->導(dǎo)出API函數(shù)方式->導(dǎo)出類方式。
            posted on 2012-08-29 18:58 Richard Wei 閱讀(4296) 評(píng)論(0)  編輯 收藏 引用 所屬分類: C++
            久久久久中文字幕| 久久久久久av无码免费看大片| 思思久久精品在热线热| 久久天天躁狠狠躁夜夜avapp| 久久婷婷五月综合色高清| 久久本道伊人久久| 7777精品伊人久久久大香线蕉| 五月丁香综合激情六月久久 | 无码人妻久久一区二区三区免费丨 | avtt天堂网久久精品| 国产精品亚洲美女久久久| 久久久久久久97| 久久久艹| 亚洲国产精品久久久久网站| 国内精品人妻无码久久久影院导航 | 久久精品久久久久观看99水蜜桃| 国产精品美女久久久久久2018| 日本欧美国产精品第一页久久| 久久精品九九亚洲精品| 亚洲AⅤ优女AV综合久久久| 国产精品久久久久久搜索| 热久久最新网站获取| 久久精品99无色码中文字幕| 麻豆亚洲AV永久无码精品久久 | 一本伊大人香蕉久久网手机| 亚洲国产精品无码久久久蜜芽 | 88久久精品无码一区二区毛片| 久久久久av无码免费网| 久久天天躁狠狠躁夜夜2020| 久久久久国产精品| 国产91色综合久久免费| 99久久这里只有精品| 亚洲AV无码成人网站久久精品大| 国内精品久久久久影院亚洲| 精品综合久久久久久88小说| 国产一区二区三区久久精品| 久久狠狠高潮亚洲精品| 97久久综合精品久久久综合| 国产精品九九九久久九九| 国产精品免费福利久久| 日本免费久久久久久久网站|