<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2007年12月7日

      哈哈,從M$ Visual C++ Team的Andy Rich那里又偷學(xué)到一招:VC8的隱含編譯項/d1reportSingleClassLayout/d1reportAllClassLayout ??磦€復(fù)雜的例子吧(如下),現(xiàn)在假設(shè)我們想知道Derived類的對象布局,怎么辦? 在Project Properties->C++->Command Line->Additional Options里面加上/d1reportSingleClassLayoutDerived吧!

    class CommonBase
    {
        
    int co;
    };

    class Base1: virtual public CommonBase
    {
    public:
        
    virtual void print1() {}
        
    virtual void print2() {}
    private:
        
    int b1;
    };

    class Base2: virtual public CommonBase
    {
    public:
        
    virtual void dump1() {}
        
    virtual void dump2() {}
    private:
        
    int b2;
    };

    class Derived: public Base1, public Base2
    {
    public:
        
    void print2() {}
        
    void dump2() {}
    private:
        
    int d;
    };

    int _tmain(int argc, _TCHAR* argv[])
    {
        
    return 0;
    }

    F5編譯之,你會驚奇地發(fā)現(xiàn),Output里面有如下字樣:

     1 class Derived size(32):
     2    +---
     3    | +--- (base class Base1)
     4  0 | | {vfptr}
     5  4 | | {vbptr}
     6  8 | | b1
     7    | +---
     8    | +--- (base class Base2)
     9 12 | | {vfptr}
    10 16 | | {vbptr}
    11 20 | | b2
    12    | +---
    13 24 | d
    14    +---
    15    +--- (virtual base CommonBase)
    16 28 | co
    17    +---
    18 
    19 Derived::$vftable@Base1@:
    20  0 | &Base1::print1
    21  1 | &Derived::print2
    22 
    23 Derived::$vftable@Base2@:
    24  0 | &Base2::dump1
    25  1 | &Derived::dump2
    26 
    27 Derived::$vbtable@Base1@:
    28  0 | -4
    29  1 | 24 (Derivedd(Base1+4)CommonBase)
    30 
    31 Derived::$vbtable@Base2@:
    32  0 | -4
    33  1 | 12 (Derivedd(Base2+4)CommonBase)
    34 
    35 Derived::print2 this adjustor: 0
    36 Derived::dump2 this adjustor: 12

    看到了嗎? VC8居然輸出了Derived對象的完整布局! 我們終于可以不必兩眼一抹黑般的去peek/poke了....第1行表明,Derived對象總占用了32字節(jié);其由三部分組成,分別是行3-行7、行 8-行12、行13、行28;其中前二者分別是基類Base1、Base2的布局,最后的行28為虛擬基類Common的布局。

    以基類 Base1部分為例,可發(fā)現(xiàn)其由一個虛函數(shù)表指針vftable和虛基表指針vbtable構(gòu)成,先看Base1部分的vftable所指向的虛表$ vftable@Base1(行19),不難發(fā)現(xiàn),其中的表項2已經(jīng)被Derived::print2給override了;再來看Base2部分的 vftable所指向的虛表$vftable@Base2(行23),可發(fā)現(xiàn),同樣的,Base2::dump2被Derived::dump2給 override了。這不明擺著就是虛函數(shù)機(jī)制嘛,heh~

    值得注意的是,這個例子同時說明,多繼承場合下,其實在單一對象中是存在多個 this指針的....行35-36給出了如何將Derived的this指針校正為其基類子對象this指針的偏移量,也就是說,根據(jù)行36,假設(shè)有個 Derived d,那么d.dump1()實際上應(yīng)該理解成通過虛表$vftable@Base2對((Base2*)(((char*)&d)+12))- >dump1()的調(diào)用....即傳遞給所有Base2成員函數(shù)的this指針應(yīng)該是(Base2*)((char*)(&d)+12),這里可能我寫得恐怖了點,意思到了就成....這不,普通繼承、多繼承、對象Slicing的語義都在這個布局里面了,看仔細(xì)了哈~

    OK,多繼承看完了,繼續(xù)看虛擬基類是如何布局的。虛基Common在Derived的布局中,位于Derived本身數(shù)據(jù)成員之后的位置。Base1、 Base2中均保存了一個vbtable指針,其分別指向各自所使用的虛基表$vbtable@Base1和$vbtable@Base2,為什么要指向一個虛基表? 很簡單,因為Base1、Base2有可能會同時繼承多個不同的虛擬基類.....這充分體現(xiàn)了C++對象布局的復(fù)雜性....在每個虛基表中,保存了所繼承的虛擬基類部分相對于子類部分vbtable指針的偏移值,以Base2為例,我們知道Base2的vbtable在Derived中的偏移值為16 (行10),則根據(jù)$vbtable@Base2,虛基Common部分距離Base2 vbtable指針的偏移值為12,則有虛基Common在Derived中的總偏移值為16+12。與普通多繼承同理,我們在調(diào)用非虛擬的虛基成員函數(shù)時,必須將Derived的this指針調(diào)整為指向虛基部分的this指針,只有這樣才能成功地訪問虛基自身的數(shù)據(jù)成員和虛基的虛擬函數(shù)(通過虛基自己的 vftable,為簡單起見,上例中我就沒弄那么復(fù)雜了,大家可以自己玩玩,明白如何舉一反三即可)
    posted @ 2007-12-07 09:56 daiyie 閱讀(643) | 評論 (2)編輯 收藏

    2007年10月25日

    Transferring the Password

    There are various ways to get the passwords stored in KeePass into other windows. The first, and most simple method is copying them to the clipboard. For this, just double-click onto the specific field in the main password list. Example: if you want to copy the password of entry X, point onto the password field of the entry in the main view and double-click. The password is copied to the clipboard. If you enable the auto-clearing option, KeePass will clear the clipboard automatically after some seconds. This prevents you from forgetting to clear the clipboard yourself, leaving sensitive data in the clipboard.

    The second method is drag-n-drop. As in method 1, point onto the field you want to use, click the left mouse button and hold it. Drag the data into other windows.

    The third, and the most powerful method is auto-type. KeePass features a very mighty auto-type feature, which types user names, passwords, etc. into other windows for you. The default auto-typing sequence is: {USERNAME}{TAB}{PASSWORD}{TAB}{ENTER}. But this sequence is customizable, per entry (read the CHM documentation file that comes with KeePass for more about this). This makes the auto-type feature applicable to all windows and webforms you'll ever see. There are two submethods to perform an auto-type:

    • Selecting an entry: Just select the entry that you want to get auto-typed, right-click onto it and click "Perform Auto-Type". KeePass will minimize itself, the window that had the focus before will come to the front. KeePass starts typing the data into this window.
    • Global hot key: This is the most powerful of all methods. You leave KeePass running in the background. As soon as you're on a site that requires a login (the password of which you stored in KeePass before), just press a hot key (by default, Ctrl-Alt-A). KeePass immediately auto-types the data into the target window.
    posted @ 2007-10-25 21:31 daiyie 閱讀(402) | 評論 (0)編輯 收藏

    2007年9月23日

    #include <boost/config.hpp>
    #include <boost/bind.hpp>
    #include <iostream>
    #include <vector>
    #include <algorithm>

    template<class T>
    inline T & ToRef( T *pT)
    {
     return *pT;
    }
    #define TODEF(x) bind( ToRef<x>, _1)

    template<class T>
    inline void DeletePointer( T *pT)
    {
     delete pT;
    }
    #define ALL(v) (v).begin(), (v).end()

    struct X
    {
    public:
     int m_t;
     X():m_t(11)
     {
     }
     
        bool f(int a)
     {
      std::cout << m_t << std::endl;
      return true;
     }
    };

    int main()
    {
        using namespace boost;
     using namespace std;
     
     vector<X *> v;
     for( int i=0; i<10; ++i)
      v.push_back( new X);
     
     for_each( ALL(v), bind(&X::f, TODEF(X), 4 ) );
     
     for_each( ALL(v), bind( DeletePointer<X>, _1) );
     
     return 0;
    }

     

    posted @ 2007-09-23 17:09 daiyie 閱讀(227) | 評論 (1)編輯 收藏

    2007年5月23日

    一天,一只兔子在山洞前寫論文。
    一只狼過來,問兔子:‘你在寫什么?” 
    答:“論文”
    狼問:“你的論文的主題是什么?” 
    答:“《論兔子如何吃掉狼》”。
    狼聽了哈哈大笑。
    兔子說,我寫的論文大部分稿子在洞里,我把道理寫的很清楚。
    狼想看看兔子的論文是怎么寫的。于是兔子把狼領(lǐng)進(jìn)山洞。
    過了一會,兔子獨自走出山洞。
    
    兔子繼續(xù)在山洞前寫它的論文。
    一只狐貍過來,問:“你在寫什么?”
    答:“我在寫論文”。
    “論文的主題是什么?” 
    答:“論兔子如何吃掉狐貍”?!?
    向來狡猾的狐貍也笑了。說:“這怎么可能呢”
    兔子說:“我寫的大部分稿子還在洞里,我把道理寫的很清楚。”
    狐貍想去看看兔子的論文是怎么寫的,于是兔子把狐貍領(lǐng)進(jìn)山洞。
    過了一會兒,兔子獨自一個走出山洞。
    
    最后,在山洞里一只獅子在幾堆白骨之間,滿意地一邊剔著牙,一邊閱讀兔子交給它的論文的提要:“一個動物,能力大小并不重要,關(guān)鍵看你的導(dǎo)師是誰。
    posted @ 2007-05-23 16:27 daiyie 閱讀(336) | 評論 (1)編輯 收藏

    據(jù)說這是道中國人老是選錯的題,當(dāng)然這樣說是有所隱喻的,不過我們大可以跳出政治的范疇,實際點說,對于政治,我們大多數(shù)人是心有余而力不足的,于是會有各種表現(xiàn),焦慮的就成了憤青一族,忍受的就成了洗腦一族,總之都沒什么好詞兒,還沒怎么呢就先自己掐起來了......

     

    上帝把兩群羊放在草原上,一群在南,一群在北。

    上帝還給羊群找了兩種天敵,一種是獅子,一種是狼。

    上帝對羊群說:“如果你們要狼,就給一只,任它隨意咬你們。

    如果你們要獅子,就給兩頭,你們可以在兩頭獅子中任選一頭,還可以隨時更換。”

     

    這道題的問題就是:如果你也在羊群中,你是選狼還是選獅子?

    很容易做出選擇吧?

    好吧,記住你的選擇,接著往下看。

     

    南邊那群羊想,獅子比狼兇猛得多,還是要狼吧。于是,它們就要了一只狼。

    北邊那群羊想,獅子雖然比狼兇猛得多,但我們有選擇權(quán),還是要獅子吧。于是,它們就要了兩頭獅子。

     

    那只狼進(jìn)了南邊的羊群后,就開始吃羊。

    狼身體小,食量也小,一只羊夠它吃幾天了。

    這樣羊群幾天才被追殺一次。

     

    北邊那群羊挑選了一頭獅子,另一頭則留在上帝那里。

    這頭獅子進(jìn)入羊群后,也開始吃羊。獅子不但比狼兇猛,而且食量驚人,每天都要吃一只羊。

    這樣羊群就天天都要被追殺,驚恐萬狀。

     

    羊群趕緊請上帝換一頭獅子。不料,上帝保管的那頭獅子一直沒有吃東西,正饑餓難耐,它撲進(jìn)羊群,比前面那頭獅子咬得更瘋狂。

    羊群一天到晚只是逃命,連草都快吃不成了。

     

    南邊的羊群慶幸自己選對了天敵,又嘲笑北邊的羊群沒有眼光。

    北邊的羊群非常后悔,向上帝大倒苦水,要求更換天敵,改要一只狼。

    上帝說:“天敵一旦確定,就不能更改,必須世代相隨,你們唯一的權(quán)利是在兩頭獅子中選擇。”

     

    北邊的羊群只好把兩頭獅子不斷更換。

    可兩頭獅子同樣兇殘,換哪一頭都比南邊的羊群悲慘得多,它們索性不換了,讓一頭獅子吃得膘肥體壯,另一頭獅子則餓得精瘦。

    眼看那頭瘦獅子快要餓死了,羊群才請上帝換一頭。

     

    這頭瘦獅子經(jīng)過長時間的饑餓后,慢慢悟出了一個道理:

    自己雖然兇猛異常,一百只羊都不是對手,可是自己的命運是操縱在羊群手里的。

    羊群隨時可以把自己送回上帝那里,讓自己飽受饑餓的煎熬,甚至有可能餓死。

    想通這個道理后,瘦獅子就對羊群特別客氣,只吃死羊和病羊,凡是健康的羊它都不吃了。

    羊群喜出望外,有幾只小羊提議干脆固定要瘦獅子,不要那頭肥獅子了。

    一只老公羊提醒說:“瘦獅子是怕我們送它回上帝那里挨餓,才對我們這么好。

    萬一肥獅子餓死了,我們沒有了選擇的余地,瘦獅子很快就會恢復(fù)兇殘的本性。”

    羊群覺得老羊說得有理,為了不讓另一頭獅子餓死,它們趕緊把它換回來。

     

    原先膘肥體壯的那頭獅子,已經(jīng)餓得只剩下皮包骨頭了,并且也懂得了自己的命運是操縱在羊群手里的道理。

    為了能在草原上待久一點,它竟百般討好起羊群來。而那頭被送交給上帝的獅子,則難過得流下了眼淚。

    北邊的羊群在經(jīng)歷了重重磨難后,終于過上了自由自在的生活。

     

    南邊的那群羊的處境卻越來越悲慘了,那只狼因為沒有競爭對手,羊群又無法更換它,

    它就胡作非為,每天都要咬死幾十只羊,這只狼早已不吃羊肉了,它只喝羊心里的血。

    它還不準(zhǔn)羊叫,哪只叫就立刻咬死哪只。

    南邊的羊群只能在心中哀嘆:“早知道這樣,還不如要兩頭獅子。”

    posted @ 2007-05-23 16:25 daiyie 閱讀(354) | 評論 (1)編輯 收藏

    2007年5月15日

     

    開始之前,確認(rèn):
    1.安裝完成Visual Studio 2005,確認(rèn)安裝的時候選中了Unicode MFC version以及CRT source code(默認(rèn)是選中的,如果你沒有改動的話那么應(yīng)該是裝上了的);
    2.找到我們要動手術(shù)的目錄,在$(Program Files)\Microsoft Visual Studio 8\VC 下,找出ATLMFC\SRC和CRT\SRC兩個文件夾;
    3.(可選)安裝Platform SDK,復(fù)制最新版本的unicows.lib放到VC\PlatformSDK\LIB中。VC8自帶有unicows.lib,所以這一步可以不做。
    一:編譯MSLU的CRT庫8.0
    首先請備份一下VC\Lib、VC\CRT\SRC、VC\ATLMFC\SRC、VC\ATLMFC\lib這四個文件夾(包括子文件夾),假如不小心改錯的話可以直接從備份的文件夾里復(fù)制文件出來。
    CRT庫需要編譯的是這6個DLL:MSVCR80.DLL、MSVCP80.DLL、MSVCM80.DLL、MSVCR80D.DLL、MSVCP80D.DLL、MSVCM80D.DLL。為方便操作,我們把將要輸出的MSLU的CRT庫文件改為別的名字以免和原來的混淆,分別改成:MSLUR80.DLL、MSLUR80D.DLL、MSLUP80.DLL、MSLUP80D.DLL、MSLUM80.DLL、MSLUM80D.DLL(如果你改成別的名字的話,后面的操作請做相應(yīng)的改正)。
    (1)先把SRC目錄下的相應(yīng)文件改名:
    copy _SAMPLE_.RC MSLUR80.RC
    copy SAMPLE_P.RC MSLUP80.RC
    copy SAMPLE_M.RC MSLUM80.RC
    copy SAMPLE_P.DEF MSLUP80.DEF
    copy SAMPLD_P.DEF MSLUP80D.DEF
    copy SAMPLE_M.DEF MSLUM80.DEF
    copy SAMPLD_M.DEF MSLUM80D.DEF
    copy SAMPLE_U.DEF MSLUU80.DEF
    copy SAMPLD_U.DEF MSLUU80D.DEF
    copy Intel\_SAMPLE_.DEF Intel\MSLUR80.DEF
    copy Intel\_SAMPLD_.DEF Intel\MSLUR80D.DEF
    (2)打開MSLUP80.DEF,修改LIBRARY SAMPLE_P為LIBRARY MSLUP80;
    打開MSLUP80D.DEF,修改LIBRARY SAMPLD_P為LIBRARY MSLUP80D;
    打開MSLUM80.DEF,修改LIBRARY SAMPLE_M為LIBRARY MSLUM80;
    打開MSLUM80D.DEF,修改LIBRARY SAMPLD_M為LIBRARY MSLUM80D;
    打開MSLUU80.DEF,修改LIBRARY SAMPLE_M為LIBRARY MSLUM80;(注意此處不是MSLUU80而是MSLUM80)
    打開MSLUU80D.DEF,修改LIBRARY SAMPLD_M為LIBRARY MSLUM80D;(注意此處不是MSLUU80D而是MSLUM80D)
    打開\Intel\MSLUR80.DEF,修改LIBRARY _SAMPLE_為LIBRARY MSLUR80;
    打開\Intel\MSLUR80D.DEF,修改LIBRARY _SAMPLD_為LIBRARY MSLUR80D;
    (3)打開SRC\makefile文件,修改開頭部分為:
    RETAIL_DLL_NAME=MSLUR80
    RETAIL_DLL_NAME=MSLUR80
    RETAIL_LIB_NAME=MSLUR80
    RETAIL_DLLCPP_NAME=MSLUP80
    RETAIL_LIBCPP_NAME=MSLUP80
    RETAIL_DLLMIXED_NAME=MSLUM80
    RETAIL_LIBMIXED_NAME=MSLUM80
    RETAIL_LIBPURE_NAME=MSLUU80
    RETAIL_PT_LIBMIXED_NAME=MLSUPTM
    RETAIL_PT_LIBPURE_NAME=MLSUPTU
    DEBUG_DLL_NAME=MSLUR80D
    DEBUG_LIB_NAME=MSLUR80D
    DEBUG_DLLCPP_NAME=MSLUP80D
    DEBUG_LIBCPP_NAME=MSLUP80D
    DEBUG_DLLMIXED_NAME=MSLUM80D
    DEBUG_LIBMIXED_NAME=MSLUM80D
    DEBUG_LIBPURE_NAME=MSLUU80D
    DEBUG_PT_LIBMIXED_NAME=MLSUPTMD
    DEBUG_PT_LIBPURE_NAME=MLSUPTUD
    RC_NAME=MSLUR80
    RCCPP_NAME=MSLUP80
    RCMIXED_NAME=MSLUM80
    54行處修改VCTOOLS,注意自己的VS2005安裝目錄,假如安裝到E:\SoftWare\Microsoft Visual Studio 8\下,則此處改為:
    VCTOOLS=E:\SoftWare\Microsoft Visual Studio 8\VC
    1779, 1841, 1905, 1940, 2037, 2105, 2139, 2230行的kernel32.lib,改為:unicows.lib kernel32.lib(一共8個不要改多了);
    (4)打開Visual Studio 2005 command prompt(從開始菜單或者是vc8的開發(fā)環(huán)境的菜單都可以啟動),進(jìn)入到SRC目錄,輸入命令設(shè)置vctools,假如VS2005安裝在E:\SoftWare\Microsoft Visual Studio 8\下,則輸入:
    Set vctools=E:\SoftWare\Microsoft Visual Studio 8\VC
    完成后輸入bldnt啟動SRC目錄下的bldnt.bat批處理文件編譯CRT庫。
    譯者:我編譯的時候出來好多warning,不管他最后還是編譯完成了。
    (5)編譯完成之后lib文件都放在SRC\BUILD\INTEL\目錄下,把文件名字改回來以便以前的程序可以鏈接,而且下面編譯MFC庫也需要。DLL文件不用改,新的lib文件知道該鏈接到誰那里。改名:
    copy MLSUPTM.LIB PTRUSTM.LIB
    copy MLSUPTMD.LIB PTRUSTMD.LIB
    copy MLSUPTU.LIB PTRUSTU.LIB
    copy MLSUPTUD.LIB PTRUSTUD.LIB
    copy MSLUR80.LIB MSVCRT.LIB
    copy MSLUR80D.LIB MSVCRTD.LIB
    copy MSLUP80.LIB MSVCPRT.LIB
    copy MSLUP80D.LIB MSVCPRTD.LIB
    copy MSLUM80.LIB MSVCMRT.LIB
    copy MSLUM80D.LIB MSVCMRTD.LIB
    copy MSLUU80.LIB MSVCURT.LIB
    copy MSLUU80D.LIB MSVCURTD.LIB
    (6)把改名后的lib文件復(fù)制到VC\LIB目錄下覆蓋原來的文件。
    (7)把步驟(4)、(5)、(6)再執(zhí)行一次來重建MSLUP80(D).DLL和靜態(tài)庫,以便他們能鏈接到我們自己的MSVCRT(D).LIB(指向我們的MSLUR80(D).DLL)。
    關(guān)掉VS2005 command prompt,因為編譯CRT庫的時候定義了許多環(huán)境變量,這些會使后面MFC庫的編譯出現(xiàn)錯誤。
    6個新的DLL文件都在\VC\crt\src\build\intel下,把這6個文件復(fù)制到系統(tǒng)目錄下。
    二:編譯MSLU的MFC庫8.0 Unicode版本
    MFC庫需要編譯的是這4個DLL:
    MFC80U.DLL (Unicode Release)
    MFC80UD.DLL (Unicode Debug)
    MFCM80U.DLL (Mixed mode/Managed Unicode Release)
    MFCM80UD.DLL (Mixed mode/Managed Unicode Debug)。
    為方便操作,我們把將要輸出的MSLU的CRT庫文件改為別的名字以免和原來的混淆,分別改成:
    MFC80LU.DLL
    MFC80LUD.DLL
    MFCM80LU.DLL
    MFCM80LUD.DLL
    (如果你改成別的名字的話,后面的操作請做相應(yīng)的改正)。
    (1)打開VC\ATLMFC\SRC\MFC\MFCDLL.MAK,在274、307行的link @<<,后面插入一行變成:
     link @<<
    /nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib
    180行的
    LIBS=$(CRTDLL) kernel32.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)
    改為:
    LIBS=$(CRTDLL) unicows.lib kernel32.lib advapi32.lib comdlg32.lib shell32.lib oledlg.lib winspool.lib oleacc.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)
    (此處不同于原文。原文為:
    LIBS=$(CRTDLL) unicows.lib kernel32.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)
    譯者依照原文修改,編譯的時候出現(xiàn)了錯誤,增加數(shù)個lib文件后編譯通過)
    (2)打開VC\ATLMFC\SRC\MFCM\MFCMDLL.MAK,在253、272行的link @<<,后面插入一行變成:
     link @<<
    /nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib
    215行的
    LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib kernel32.lib gdi32.lib msimg32.lib user32.lib \
    改為:
    LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib unicows.lib kernel32.lib advapi32.lib comdlg32.lib shell32.lib oledlg.lib winspool.lib mpr.lib oleacc.lib gdi32.lib msimg32.lib user32.lib \
    (此處原文為:
    LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib unicows.lib kernel32.lib gdi32.lib msimg32.lib user32.lib \
    其余說明同上)
    (3)打開\VC\atlmfc\src\mfcm\INTEL\mfcm80u.def 文件,把第10行的LIBRARY mfcm80u 改為:
    LIBRARY mfcm80Lu
    打開\VC\atlmfc\src\mfcm\INTEL\mfcm80ud.def文件,把第10行的LIBRARY mfcm80ud改為:
    LIBRARY mfcm80Lud
    (4)打開\VC\atlmfc\src\mfcm\wfrmcmd.cpp文件,251行的#error Following information required to build private version用//注釋掉或者直接把該行刪掉;253行的[assembly: AssemblyTitle("")];改為:
    [assembly: AssemblyTitle("mfcm80L")];
    (5)打開\VC\atlmfc\src\mfcm\interfaces\AssemblyInfo.cpp文件,78行的#error Following information required to build private version用//注釋掉或者直接把該行刪掉;85行的[assembly: AssemblyTitle("")];改為:
    [assembly: AssemblyTitle("mfcm80Lifaces")];
    (6)在\VC\atlmfc\src\下建立一個批處理文件:buildmfc.bat,內(nèi)容為:
    nmake -f atlmfc.mak MFC libname=MFC80L
    (7)打開Visual Studio 2005 command prompt,進(jìn)入目錄\VC\atlmfc\src\,輸入buildmfc執(zhí)行buildmfc.bat編譯MFC庫。
    編譯完成之后,在\VC\atlmfc\src\mfc\intel下有MFC80LU.DLL、MFC80LUD.DLL,在\VC\atlmfc\src\mfcm\INTEL下有MFCM80LU.DLL、MFCM80LUD.DLL,把這4個DLL文件復(fù)制到系統(tǒng)目錄下;在\VC\atlmfc\lib\INTEL下有MFC80LU.LIB、MFC80LUD.LIB、MFCM80LU.lib、MFCM80LUD.lib,把文件名改為:
    MFC80U.LIB、MFC80UD.LIB、MFCM80U.lib、MFCM80UD.lib
    把這四個lib文件復(fù)制到\VC\atlmfc\lib下覆蓋原來的文件就完成了。
    posted @ 2007-05-15 22:47 daiyie 閱讀(1347) | 評論 (0)編輯 收藏
    僅列出標(biāo)題  

    導(dǎo)航

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    統(tǒng)計

    常用鏈接

    留言簿(1)

    隨筆檔案

    收藏夾

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: fc2免费人成在线| 精品久久亚洲一级α| 韩日电影在线播放免费版| 日本一区免费电影| 亚洲av无码专区在线观看下载| 成年在线网站免费观看无广告| 亚洲日韩国产欧美一区二区三区| 日韩免费a级毛片无码a∨| 亚洲乱码中文字幕在线| 国产精品免费播放| 一级a性色生活片久久无少妇一级婬片免费放 | 亚洲中文字幕日产乱码高清app| 中文字幕在线免费观看| 亚洲第一精品电影网| 日本在线高清免费爱做网站| 亚洲日韩国产二区无码| 亚洲精品无码日韩国产不卡?V| 午夜不卡AV免费| 久久久久久a亚洲欧洲AV| 美女视频黄免费亚洲| 亚洲av无码日韩av无码网站冲| 免费人成视频在线观看不卡| 国产国产人免费人成成免视频| 亚洲成人免费在线| 毛片A级毛片免费播放| 日本高清不卡中文字幕免费| 亚洲av无码av制服另类专区| 亚洲免费在线观看视频| 久久无码av亚洲精品色午夜| 久久久久无码专区亚洲av| 91在线手机精品免费观看| 亚洲国产成人久久精品大牛影视| 亚洲欧洲自拍拍偷精品 美利坚| 国产精品区免费视频| 亚洲精品无码av片| 亚洲国产精品无码久久久蜜芽| 免费无码A片一区二三区| yellow视频免费看| 亚洲1234区乱码| 亚洲综合色婷婷七月丁香| 无码国产精品一区二区免费I6|