中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
MFC的秘密:它的靜態(tài)庫和動態(tài)庫所在何處

1.Dependency Walker的第一道揭秘

在MFC中我們寫過很多靜態(tài)庫和動態(tài)庫。這些dll都依賴于MFC;然后我們又交給別人使用,使得它們被依賴。

細想一下,就可能會發(fā)現(xiàn)其中的不平衡。我們生成的非組件dll,要交給別人使用,必須提供h頭、lib庫和dll庫文件;可是我們使用MFC的dll時,好像什么也沒有設(shè)置,MFC不請自來的加入到我們的程序中。雖然知道這個世界,每個人其實并不是平等的;但是在計算機的世界,自由平等卻是第一法則。搞清MFC如何嵌入到我們的應(yīng)用程序中,將一切黑暗中的操作暴露出來,將是我們的任務(wù)。

舉個例子,隨便用向?qū)梢粋€MFC 的對話框程序。里面測試一個組件,然后調(diào)用wcslen求一個BSTR的長度。就是一個很簡單的exe;通過Dependency Walker就發(fā)現(xiàn)它依賴了很多dll。如下:

    其中,這些函數(shù)何去何來,這個就是我們要弄清楚的秘密。
  • MFC42D.DLL
  • MSVCRTD.DLL
  • MFCO42D.DLL
  • OLEAUT32.DLL

2.MFC的組成

直接揭開謎底:MFC由四部分組成。可能這種說法不準確,應(yīng)該說,VC的核心底層API由下面部分組成:

  • CRT(C runtime): 最底層的微軟對c、c++標準庫的實現(xiàn)版本;接口參照標準規(guī)范;MFC依賴于此。但是windows API不依賴于此,有內(nèi)部自己的實現(xiàn)版本
  • Windows API: 微軟的操作系統(tǒng)怎么弄出來的,全靠它們了,以C的API形式提供
  • MFC: 對windows API進行類的封裝?;旧虾w部分CRT和全部Windows API。該小組是AFX小組。
  • ATL: 微軟全面邁入組件解決方案時的封裝。該小組是Com小組。

如下表:

 

其實看看vc的目錄組織結(jié)構(gòu)大概也知道其分組。

MFC 靜態(tài)庫和動態(tài)庫

最流行的是使用MFC作為dll,同時將自身的也作為dll。在這種情況下,如果深挖進去,最容易發(fā)現(xiàn)的是MFC的dll。

參照 MSDN中的“Naming Conventions for MFC DLLs”,可以發(fā)現(xiàn),基于動態(tài)鏈接庫的MFC的命名規(guī)范為:MFC[D|O|N]x[U][D].DLL。

主要包含的屬性為:功能模塊(Core | OLE | DB | NET),版本(VC6對應(yīng)42,VS2003對應(yīng)70,VS2005對應(yīng)80,VS2008對應(yīng)90),是unicode還是Ansi,是release還是debug。

稍微注意的是:debug版本下每個功能模塊對應(yīng)一個lib;但是release版本下,合起來為一個統(tǒng)一的lib文件MFC42.lib。

其實還存在,靜態(tài)鏈接庫。但是其名字可能更不著調(diào) :[N|U]AFXDW[D].LIB

其中包含unicode和非unicode,debug和release區(qū)分。

CRT 靜態(tài)庫和動態(tài)庫

參照MSDN中的“INFO: What Are the C/C++ Libraries My Program Would Link With?”。

當我們調(diào)用sprintf,wcslen等此類函數(shù)時,我們就依賴了該庫。

這個可以通過編譯設(shè)置:

實際上對應(yīng)的編譯項是:/MD /ML /MT


3.靜態(tài)庫和動態(tài)庫

核心

有關(guān)靜態(tài)庫和動態(tài)庫的相關(guān)概念,以及連接中出現(xiàn)的一些問題,其實所有的核心就是:

  • 搞清楚引用別人的庫是靜態(tài)還是動態(tài)庫;
  • 把自己作為庫給別人使用時是靜態(tài)庫還是動態(tài)庫

真正所謂取之與民,用之于民。

其中還經(jīng)常出現(xiàn)的一個問題是,引用的系統(tǒng)底層庫有哪些,到底是靜態(tài)庫還是動態(tài)庫。通常,對于MFC程序,一定會依賴于MFC庫;可以選擇性的依賴CRT庫。搞清楚使用的靜態(tài)庫和動態(tài)庫,不要沖突就行。

幾種靜態(tài)庫和動態(tài)庫

在VC6中,對于靜態(tài)動態(tài)庫,去除組件作為一種特殊的動態(tài)庫外,還剩下5種類型。一一生成一個演示程序,研究設(shè)置,大概就可以看出區(qū)別。

靜態(tài)庫導(dǎo)出的是 h頭文件和lib文件。該lib文件包含著程序代碼,會比較大。源代碼編譯的時候使用頭文件,鏈接的時候使用lib文件。

動態(tài)庫導(dǎo)出的是 h頭文件、lib和dll文件。該lib文件只包含著程序的函數(shù)索引位置,比較小。源代碼編譯時使用頭文件,鏈接時使用lib文件,運行時需要dll文件。

 

這是MFC dll


 以下是對各dll分析:

其實,本質(zhì)上可以看出,只有兩種庫:靜態(tài)庫和動態(tài)庫;標明自身是靜態(tài)庫還是動態(tài)庫。

靜態(tài)庫由于生來是被別人使用的,所以也就不存在導(dǎo)入導(dǎo)出標識;

而動態(tài)庫一定要存在導(dǎo)入導(dǎo)出標識。對于dll,存在MFC dll和普通的win dll。其實所謂的MFC dll只不過是將DllMain進行特殊封裝,特別是為了方便資源的存取。而所謂的Extension dll,只不過是為了兼容C;要求只導(dǎo)出非MFC類的函數(shù)而已。

這些靜態(tài)庫如何使用MFC 庫,如何使用CRT庫,其實都是可以設(shè)置的。這點用來解決引用庫是什么庫。

對于靜態(tài)庫和動態(tài)庫,MFC向?qū)蓵r,會自動弄出一些編譯設(shè)置項。但是最根本的核心還是dsp中的:

# TARGTYPE "Win32 (x86) Static Library" 0x0104

!MESSAGE "TestStaticLib - Win32 Release" (based on "Win32 (x86) Static Library")

!MESSAGE "TestStaticLib - Win32 Debug" (based on "Win32 (x86) Static Library")

如果要將一個靜態(tài)庫編譯成另一個動態(tài)庫,或者相反;只需要在dsp中統(tǒng)一查找替換為另一種格式即可。當然,更加鼓勵的是生成多個編譯配置項。

避免沖突的方法

對于靜態(tài)庫和動態(tài)庫,在編譯鏈接中總是會存在問題。這些問題的根本原因在于:一個工程中,同時對于某一個工程,既引入了其靜態(tài)庫,又引入了其動態(tài)庫。這樣會出現(xiàn)同名沖突。

    解決的方法有兩種:
  • 確保所有工程對某個庫采用同一種方式引入。這個可能要搜遍所有工程
  • 對于編譯不過的工程,已知某一個庫沖突,將該庫的靜態(tài)和動態(tài)庫忽略一個即可。

 


4.如何最大化最合理利用各功能庫

  • 程序如果就是一個MFC程序,建議盡量使用MFC庫;盡量不依賴于CRT庫。
  • 程序如果只是一個WIN32 程序,建議盡量不使用MFC庫,選擇性的依賴于CRT庫。
  • 程序如果只是一個控制臺程序,盡量依賴于CRT庫,少依賴于win api庫和MFC庫。

原則,盡量少的依賴庫。對于同功能的函數(shù),可能CRT有,Win API庫,MFC庫,選擇性的找到正確的庫。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C 調(diào)用靜態(tài)庫和動態(tài)庫
LIB文件與DLL文件
VC++加載動態(tài)庫和靜態(tài)庫
動態(tài)庫、靜態(tài)庫、運行時庫、引入庫之間的區(qū)別
Windows下靜態(tài)庫、動態(tài)庫的創(chuàng)建和調(diào)用過程
動態(tài)鏈接庫dll,靜態(tài)鏈接庫lib, 導(dǎo)入庫lib
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服