<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>

    Rss & SiteMap

    曙海教育集團論壇 http://www.bjzhda.cn

    曙海教育集團論壇
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]
    [瀏覽完整版]

    標(biāo)題:技術(shù)討論總結(jié) -之- DLL和COM

    1樓
    wangxinxin 發(fā)表于:2010-12-14 14:52:04
    本周技術(shù)討論會主要議題是DLL和COM

    DLL是微軟創(chuàng)造的二進制級別代碼重用和應(yīng)用程序管理的技術(shù). DLL有如下這些好處:
    1. 由于DLL動態(tài)加載的特性, 使得DLL模塊和應(yīng)用程序主干相剝離, 便于程序的升級 -----升級某個模塊的功能只需覆蓋某個DLL就可以了, 無需重新編譯全部代碼.
    2. DLL的另一個好處也來自動態(tài)加載, 因此依賴于這個模塊的其他各類應(yīng)用程序不需與DLL編譯在一起, 因此省出了更多的硬盤空間. 假如使用靜態(tài)鏈接, 則每一個應(yīng)用程序都需包含相應(yīng)的模塊鏡像, 對磁盤的浪費是很嚴(yán)重的.
    3. 更為重要的, 使用DLL還有助于節(jié)省內(nèi)存. 因為系統(tǒng)為DLL提供了引用計數(shù), 所有加載DLL的進程共享DLL的頁面(當(dāng)然數(shù)據(jù)不能共享,數(shù)據(jù)由進程自己保存.能夠共享的是相當(dāng)于代碼段的頁面),因此DLL使得內(nèi)存的使用更有效.
    4. 使用DLL可以實現(xiàn)多語言編程.例如VB的程序可以調(diào)用C++代碼實現(xiàn)的DLL模塊里面的函數(shù).

    DLL有兩種加載方式, 一種是隱示加載, 就是在應(yīng)用程序里包含DLL編寫者提供的.h文件和編譯時產(chǎn)生的.lib文件. 這樣DLL將會在程序啟動時加載入進程. 可以想見, 如word這類的程序在啟動之時如此緩慢, 就是在不斷的加載各種DLL模塊.
    另一種加載方式就是在程序中調(diào)用LoadLibrary函數(shù)顯示加載DLL, 然后通過調(diào)用GetProcAddress函數(shù)獲取相應(yīng)函數(shù)的地址(即函數(shù)指針), 從而調(diào)用DLL內(nèi)的函數(shù). 這種做法有一個很好的優(yōu)點就是不必所有的DLL都在啟動時加載, 很多DLL模塊都可以在需要使用的時候再臨時加載, 有些DLL假如沒有用到可以一直不加載. 我個人認為這是很好的用戶體驗. 我不理解的是為什么MS的各類產(chǎn)品沒有使用這種方式進行程序設(shè)計.或許他已經(jīng)用了, 但是啟動時候必須加載的DLL項目太多?我就不再猜測了..
    顯示加載的DLL需要手動卸載, 調(diào)用FreeLibrary函數(shù)卸載它.

    與普通的EXE一樣, DLL也有一個進入點函數(shù), 名字叫做DllMain, 這個函數(shù)接受三個參數(shù), HINSTANCE hInst, DWORD fdwReason, PVOID fImpLoad
    我在這里只討論第二個參數(shù)fdwReason. 它可以是4個值: DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH
    分別表示DLL首次加載,DLL從進程中釋放, DLL線程的構(gòu)造和終止. 其實系統(tǒng)為DLL提供了引用計數(shù), DLL只加載入RAM一次, 所有進程共享DLL的各個頁面, 所以只有第一次加載會調(diào)用帶有DLL_PROCESS_ATTACH的DllMain. 但每次DLL從進程中釋放都會調(diào)用帶DLL_PROCESS_DETACH的DllMain, 這是因為進程保存了DLL里面的一些變量可能需要釋放掉.
    因此DllMain可以阻止進程結(jié)束.它可以在DLL_PROCESS_DETACH消息中放一個死循環(huán),等待所有資源都被釋放掉才退出. 如果有些資源出了問題, 就可能導(dǎo)致DLL無法正常退出.這就是為什么有些程序即使你去點小紅叉叉也結(jié)束不了進程的原因.這種情況可以調(diào)用TerminateProcess函數(shù)強關(guān)進程.這就是為什么通過任務(wù)管理器仍然能結(jié)束進程的原因(但是這樣做有可能丟失數(shù)據(jù)...)
    共1 條記錄, 每頁顯示 10 條, 頁簽: [1]

    Copyright © 2000 - 2009 曙海教育集團
    Powered By 曙海教育集團 Version 2.2
    Processed in .01563 s, 2 queries.
    主站蜘蛛池模板: 国产午夜无码视频免费网站| 男人用嘴添女人下身免费视频| 无翼乌无遮挡h肉动漫在线观看| 国产AV午夜精品一区二区三区| 三级黄色片免费看| 最新国产精品亚洲| 四虎影视永久免费观看| av无码aV天天aV天天爽| 日韩毛片在线免费观看| 人妻一本久道久久综合久久鬼色 | 男朋友想吻我腿中间部位 | 少妇厨房愉情理9仑片视频| 厨房掀起馊子裙子挺进去| freee×xx性欧美| 日韩欧美久久一区二区| 四虎影院的网址| 黄色成年人视频| 怡红院在线影院| 亚洲成在人线中文字幕| 男女一对一免费视频| 国产伦子系列视频6| wwwxxx国产| 日本高清在线中文字幕网| 公和熄三级中字电影久久| 4480新热播影院| 成年视频在线播放| 亚洲第一成年免费网站| 精品91一区二区三区| 国产激情一区二区三区| 中国老人倣爱视频| 最近中文字幕免费完整国语| 免费av一区二区三区| 青青热久久久久综合精品| 天天躁日日躁狠狠躁av麻豆| 亚洲一成人毛片| 狠狠色丁香婷婷综合久久片| 国产欧美日韩精品一区二区三区| 一级片黄色免费| 日韩在线观看第一页| 亚洲欧美日韩中文在线制服| 美女扒开尿口给男人桶爽视频|