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

            MyMSDN

            MyMSDN記錄開發(fā)新知道

            #

            [翻譯]關(guān)于“異步可插協(xié)議”(About Asynchronous Pluggable Protocols(APPs))

                 摘要: [翻譯]關(guān)于“異步可插協(xié)議”(About Asynchronous Pluggable Protocols(APPs))

            原文鏈接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx
              閱讀全文

            posted @ 2008-03-28 02:21 volnet 閱讀(1223) | 評論 (0)編輯 收藏

            [學(xué)習(xí)筆記]C++ Primer[第二章]基本語言

            Page 30 ( Chapter 2 基本語言)
            算術(shù)類型的存儲(chǔ)空間依機(jī)器而定。
            Page 30 ( Chapter 2 基本語言)
            表示整數(shù)、字符和布爾值的算術(shù)類型合稱為整形(integral type)
            字符類型有兩種:char和wchar_t。char類型通常是單個(gè)機(jī)器字節(jié)(byte)。wchar_t類型用于擴(kuò)展字符集,比如漢字和日語
            Page 31 ( Chapter 2 基本語言)
            在位這一級上,存儲(chǔ)器是沒有結(jié)構(gòu)和意義的。
            讓存儲(chǔ)具有結(jié)構(gòu)的最基本方法是用塊(chunk)處理存儲(chǔ)?!m然確切的大小因機(jī)器不同而不同,但是通常將8位的塊作為一個(gè)字節(jié),32位或4個(gè)字節(jié)作為一個(gè)“字(word)”
            Page 32 ( Chapter 2 基本語言)
            C++標(biāo)準(zhǔn)并未定義signed類型如何用位來表示,而是由每個(gè)編譯器自由決定如何表示signed類型。……符號位為1,值就為負(fù)數(shù);符號位為0,值就為0或正數(shù)?!行┱Z言中將負(fù)數(shù)賦給unsigned類型是非法的,但在C++中這是合法的。
            Page 35 ( Chapter 2 基本語言)
            為了兼容C語言,C++中所有的字符串字面值都由編譯器自動(dòng)在末尾添加一個(gè)空字符。
            Page 36 ( Chapter 2 基本語言)
            兩個(gè)相鄰的僅由空格、制表符或換行符分開的字符串字面值(或?qū)捵址置嬷担?,可連接成一個(gè)新字符串字面值。
            //concatenated long string literal
            std::cout<<"a multi-line "
            "string literal "
            "using concatenation "
            <<std::endl;
            執(zhí)行這條語句將會(huì)輸出:
            a multi-line string literal using concatenation
            如果連接字符串字面值和寬字符串字面值,將會(huì)出現(xiàn)什么結(jié)果呢?例如:
            //Concatenating plain and wide character strings is undefined
            std::cout<<"multi-line" L"literal "<<std::endl;
            其結(jié)果未定義的(unsigned),也就是說,連接不同類型的行為標(biāo)準(zhǔn)沒有定義。這個(gè)程序可能會(huì)執(zhí)行,也可能會(huì)崩潰或者產(chǎn)生沒有用的值,而且在不同的編譯器下程序的動(dòng)作可能不同。
            Page 36 ( Chapter 2 基本語言)
            在一行的末尾加一反斜線符號可將此行和下一行當(dāng)作同一行處理。
            std::cou\
            t<<"Hi"<<st\
            d::endl;
            等價(jià)于
            std::cout<<"Hi"<<std::endl;
            注意反斜線符號必須是該行的尾字符——不允許其后面有注釋或空格。同樣,后繼行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,長字符串字面值的后繼行才不會(huì)有正常的縮進(jìn)。
            Page 39 ( Chapter 2 基本語言)
            C++是一門靜態(tài)類型語言,在編譯時(shí)會(huì)作類型檢查。
            Page 41 ( Chapter 2 基本語言)
            標(biāo)識符不能包含兩個(gè)連續(xù)的下劃線,也不能以下劃線開頭后面緊跟一個(gè)大寫字母。有些標(biāo)識符(在函數(shù)外定義的標(biāo)識符)不能以下劃線開頭。
            Page 42 ( Chapter 2 基本語言)
            C++支持兩種初始化變量的形式:復(fù)制初始化(copy-initialization)和直接初始化(direct-initialization)。復(fù)制初始化語法用等號(=),直接初始化則是把初始化式放在括號中:
            int ival(1024);    //direct-initialization
            int ival = 1024;    //copy-initialization
            Page 43 ( Chapter 2 基本語言)
            也可以通過一個(gè)計(jì)數(shù)器和一個(gè)字符初始化string對象。這樣創(chuàng)建的對象包含重復(fù)多次的指定字符,重復(fù)次數(shù)由計(jì)數(shù)器指定:
            std::string all_nines(10,'9');    //all_nines="9999999999"
            本例中,初始化all_nines的唯一方法是直接初始化。有多個(gè)初始化式時(shí)不能使用復(fù)制初始化
            Page 44 ( Chapter 2 基本語言)
            內(nèi)置類型變量是否自動(dòng)初始化取決于變量定義的位置。在函數(shù)體外定義的變量都初始化成0,在函數(shù)體里定義的內(nèi)置類型變量不進(jìn)行自動(dòng)初始化。
            Page 46 ( Chapter 2 基本語言)
            extern聲明不是定義,也不分配存儲(chǔ)空間。
            ……
            只有當(dāng)extern聲明位于函數(shù)外部時(shí),才可以含有初始化式。
            Page 50 ( Chapter 2 基本語言)
            非const變量默認(rèn)為extern,要使const變量能夠在其他的文件中訪問,必須顯式地指定它為extern
            Page 51 ( Chapter 2 基本語言)
            引用只是對象的另一個(gè)名字
            Page 52 ( Chapter 2 基本語言)
            const引用可以初始化為不同類型的對象或者初始化為右值
            ……
            非const引用只能綁定到與該引用同類型的對象。
            const引用則可以綁定到不同但相關(guān)的類型的對象或綁定到右值。
            Page 56-57 ( Chapter 2 基本語言)
            如果使用class關(guān)鍵字來定義類,那么定義在第一個(gè)訪問標(biāo)號前的任何成員都隱式指定為private;如果使用struct關(guān)鍵字,那么這些成員都是public。使用class還是struct關(guān)鍵字來定義類,僅僅影響默認(rèn)的初始化訪問級別。
            可以等效地定義Sales_item類為:
            struct Sales_item{
                //no need for public label, memebers are public by default
                //operations on Sales_item objects
            private:
                std::string isbn;
                unsigned units_sold;
                double revenues
            };
            本例的類定義和前面的類定義只有兩個(gè)區(qū)別:這里使用了關(guān)鍵字struct,并且沒有在花括號后使用關(guān)鍵字public。struct的成員都是public,除非有其他特殊的聲明,所以就沒有必要添加public標(biāo)號。
            用class和struct關(guān)鍵字定義類的唯一差別在于默認(rèn)訪問級別:默認(rèn)情況下,struct的成員為public,而class的成員為private。
            Page 59 ( Chapter 2 基本語言)
            這種行為有一個(gè)很重要的含義:當(dāng)我們在頭文件中定義了const變量后,每個(gè)包含該頭文件的源文件都有了自己的const變量,其名稱和值都一樣。

            posted @ 2007-06-16 01:32 volnet 閱讀(1022) | 評論 (2)編輯 收藏

            第一次直接用命令行的方式直接編譯C++

            其實(shí)也不是真正的第一次,以前有用csc進(jìn)行編譯.net的程序,可以算是第一次用cl編譯吧。

            今天讀了C++ Primer,還是決定用這個(gè)最原始的方法來編譯,感受一下歷史的美,順便對比一下今天大量IDE環(huán)境下的幸福的我們。

            新開一個(gè)記事本,寫下以下代碼(好土的代碼,溫故而知新啦):

            #include <iostream>
            int main()
            {
                std::cout<<"Enter two numbers:"<<std::endl;
                int v1,v2;
                std::cin>>v1>>v2;
                std::cout<<"The sum of " <<v1<<" and "<<v2<<" is "<<v1+v2<<std::endl;
                return 0;
            }

            保存為Unicode格式的prog1.cc(故意不用cpp,哈哈,天天用cpp給人感覺又是用VS創(chuàng)建的)

            印象中以上代碼的標(biāo)準(zhǔn)庫似乎在VS2005創(chuàng)建的ConsoleApplication下已經(jīng)無法編譯了。

            打開Visual Studio 2005 命令提示工具(開始->程序->“然后就是VS的那個(gè)快捷方式了”)

            打開后就出現(xiàn)了命令提示窗口:(我的程序放在E盤底下的CPP文件夾內(nèi),命名為prog1.cc)

            Setting environment for using Microsoft Visual Studio 2005 x86 tools.

            D:\Program Files\Microsoft Visual Studio 8\VC>E:

            E:\>cd cpp

            E:\cpp>cl -EHsc prog1.cc
            用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 14.00.50727.762 版
            版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。

            prog1.cc
            Microsoft (R) Incremental Linker Version 8.00.50727.762
            Copyright (C) Microsoft Corporation.  All rights reserved.

            /out:prog1.exe
            prog1.obj

            E:\cpp>prog1
            Enter two numbers:
            3 7
            The sum of 3 and 7 is 10

            這時(shí)候進(jìn)入文件夾也可以看到多了兩個(gè)文件prog1.exe和prog1.obj

            怎么樣,有意思吧。呵呵,也不知道自己會(huì)堅(jiān)持使用這種方法多久。呵呵!

            posted @ 2007-06-09 19:46 volnet 閱讀(1936) | 評論 (2)編輯 收藏

            [學(xué)習(xí)筆記]C++ Primer[第一章]快速入門

            [目的]

            記錄C++ Primer學(xué)習(xí)中遇到的需要記憶的東西,這里僅以我個(gè)人為標(biāo)準(zhǔn)進(jìn)行記錄。

            [格式]

            以下樣例代表了本文所描述的所有摘要片段將通過以下模版進(jìn)行創(chuàng)建。

            Page [PageIndex] ( Chapter [ChapterIndex] [Title of Chapter])
            [正文]

            [正文]

            Page 3 ( Chapter 1 快速入門)
                  在大多數(shù)系統(tǒng)中,main函數(shù)的返回值是一個(gè)狀態(tài)指示器。返回值0往往表示main函數(shù)成功執(zhí)行完畢。任何其他非零的返回值都有操作系統(tǒng)定義的含義。通常非零返回值表明有錯(cuò)誤出現(xiàn)。每一種操作系統(tǒng)都有自己的方式告訴用戶main函數(shù)返回什么內(nèi)容。
            Page 3 ( Chapter 1 快速入門)

            在書中提到的
            C:\directory> cl -GX prog1.cpp
            命令在利用VS2005所帶的32位C/C++優(yōu)化編譯器下會(huì)出現(xiàn)如下提示:

            用于 80x86 的 Microsoft (R) 32 位 C/C++ 優(yōu)化編譯器 14.00.50727.762 版
            版權(quán)所有(C) Microsoft Corporation。保留所有權(quán)利。

            cl: 命令行 warning D9035 :“GX”選項(xiàng)已否決,并將在將來的版本中移除
            cl: 命令行 warning D9036 :使用“EHsc”而不使用“GX”

            Page 5 ( Chapter 1 快速入門)
            并沒有直接定義進(jìn)行輸入或輸出(IO)的任何語句,這種功能是由標(biāo)準(zhǔn)庫提供的。
            Page 6 ( Chapter 1 快速入門)
            std::cout<<"Enter two number:"<<std::endl;
            每個(gè)輸出操作符實(shí)例都接受兩個(gè)操作數(shù):左操作數(shù)必須是ostream對象;右操作數(shù)是要輸出的值。操作符將其右操作數(shù)寫到作為其左操作數(shù)的ostream對象。
            (std::cin與std::cout相反:
            std::cout 左←右(注意箭頭方向)
            std::cin 左→右(注意箭頭方向))
            ……
            endl是一個(gè)特殊之,稱為操縱符(manipulator),將它寫入輸出流時(shí),具有輸出換行的效果,并刷新與設(shè)備相關(guān)聯(lián)的緩沖區(qū)(buffer)。通過刷新緩沖區(qū),用戶可立即看到寫入到流中的輸出。
            Page 16 ( Chapter 1 快速入門)
            當(dāng)我們使用istream對象作為條件,結(jié)果是測試流的狀態(tài)。如果流是有效的(也就是說,如果讀入下一個(gè)輸入是可能的)那么測試成功。遇到文件結(jié)束符(end-of-file)或遇到無效輸入時(shí),如讀取了一個(gè)不是整數(shù)的值,則istream對象是無效的。處于無效狀態(tài)的istream對象將導(dǎo)致條件失敗。
            【本信息針對上文中】
            int sum = 0,value;
            while(std::cin>>value)   //以前很少在while里面使用這樣的輸入
            ……
            Page 20 ( Chapter 1 快速入門)
            點(diǎn)操作符通過它的左操作數(shù)取得有操作數(shù)。點(diǎn)操作符僅應(yīng)用于類類型的對象:左操作數(shù)必須是類類型的對象,右操作數(shù)必須指定該類型的成員。

            posted @ 2007-06-09 17:29 volnet 閱讀(1410) | 評論 (6)編輯 收藏

            不盡的想法,不夠的時(shí)間

            今天收到當(dāng)當(dāng)網(wǎng)寄過來的C++ Primer感覺興奮的同時(shí)又開始擔(dān)心。

            記得前兩天寫下學(xué)習(xí)計(jì)劃這樣的文章,將未來設(shè)計(jì)地如此“完美”,但今天拿到書后又一陣壓力壓得我喘不過氣來,七百多頁的書握在手上著實(shí)又厚實(shí)了許多,但給我?guī)淼牟皇恰疤?shí)”的感覺,而是壓力。當(dāng)年在??梢砸惶旄C在圖書館看書,800多頁的書也就一頁一頁地啃下來了,前后也就兩個(gè)月多,而且效率還挺高的。但現(xiàn)在看這本大部頭就讓我覺得壓力,每天工作之余也挺累的,真不知道自己該如何堅(jiān)持高效地完成這本書,其實(shí)在我看來,高效地看書比單純意義上的看書是更值得關(guān)注的。

            下面就我對高效看書做一個(gè)簡要總結(jié)(針對計(jì)算機(jī)類書籍(非理論型)):

            1、看書我習(xí)慣一次性看一大部分,比如說前后章節(jié)關(guān)聯(lián)比較緊密的,我習(xí)慣性會(huì)堅(jiān)持看完,連貫性的東西拆開看,通常會(huì)降低效率。而且我不是那種合上書本前說明天再看就一定會(huì)去看的人,因此為了不然自己接下去看的時(shí)候已經(jīng)是下個(gè)月的這種情況發(fā)生,我都會(huì)堅(jiān)持將一個(gè)部分看完。

            2、建議在效率高的時(shí)候看書,看書切忌為了數(shù)量而不追求質(zhì)量,有的時(shí)候可能你很困或者注意力很難集中,那切忌不要看,因?yàn)榭戳说扔跊]看,而似乎又不愿意回頭再看,這樣將浪費(fèi)那部分內(nèi)容。

            3、看書不提倡做小動(dòng)作,之所以說不提倡是因?yàn)槲覍⒄f“比如拿個(gè)筆晃來晃去”,因?yàn)檫@個(gè)習(xí)慣很多人都有,但是有的人受影響小,有的人則完全分心了。

            4、看書一定要抓住重點(diǎn)多看幾眼,以前看書經(jīng)??春蟛恢?,后來發(fā)現(xiàn)需要多關(guān)注重點(diǎn),雖然不是每個(gè)字都要記住,但是重點(diǎn)部分一定要多看幾眼,至于重點(diǎn)是什么,我想抱著求學(xué)的態(tài)度去認(rèn)真看,重點(diǎn)不難找出。記得要多斟酌幾遍,有什么可以隨手記在邊上。

            5、看書要勤做練習(xí),這點(diǎn)和計(jì)算機(jī)特別有關(guān)聯(lián),其實(shí)非常簡單的代碼,不去實(shí)踐一下也是不容易記住的,哪怕只是抄到電腦上,或許你就會(huì)有新的發(fā)現(xiàn)。而且有的時(shí)候斷點(diǎn)調(diào)試會(huì)有很多新的思路,對于自己在看書的時(shí)候有任何的疑問可以隨手記錄,比如你可以推算一段代碼的某一處某個(gè)變量的值是否和你所預(yù)期的一樣等等,其實(shí)這些都很容易就能夠掌握,關(guān)鍵在一個(gè)“勤”字。

            6、看書要多加思考,如果有個(gè)學(xué)習(xí)伙伴那就更好,可以互相交流,有的時(shí)候很明顯的東西或許有有分歧的理解,這時(shí)候就是更需要證明的,證明自己往往要比自己看書更容易掌握,你不會(huì)告訴自己曾經(jīng)某個(gè)時(shí)候你在某個(gè)地方對某個(gè)問題有深入的了解,但你一定會(huì)記得某個(gè)時(shí)候和伙伴為了一個(gè)細(xì)節(jié)爭論正確,最后不管戰(zhàn)況如何,你總是能記住那個(gè)被你求證過的結(jié)果,而不只是印象中的“似曾相識”。

            7、看書一定要看好書,推薦到論壇上找找,總是有很多熱心人曾今推薦過,那些被廣泛支持的可以簡單地稱作“經(jīng)典”,但切忌不要買了很多卻每本只看第一章。

            以上是我個(gè)人對看書的一點(diǎn)小小的心得。

            本來想寫一篇發(fā)泄壓抑的文章,但寫著寫著就成了表達(dá)看書心得了,既然寫了就發(fā)布上來,希望大家對我的看書心得給予評價(jià)。

            希望未來一段時(shí)間我能堅(jiān)持用自己總結(jié)的方法來按期完成任務(wù)。我現(xiàn)在在使用Gmail的日歷來管理我的時(shí)間,希望這對我有益,也希望大家能夠找個(gè)日歷來管理自己的時(shí)間(Gmail,Hotmail,Yahoo等都有挺不錯(cuò)的日歷管理功能,大家根據(jù)各自的需要選擇吧)

            有效管理時(shí)間,讓未來過得充實(shí)而又充滿豐收的喜悅。

            posted @ 2007-06-08 19:41 volnet 閱讀(353) | 評論 (3)編輯 收藏

            【學(xué)習(xí)計(jì)劃】C#與C++并行生存,為了設(shè)計(jì),為了工作,為了生活,為了……

            半年前的軟件工程課程設(shè)計(jì)和SysClock是我C++的上一個(gè)句號。在學(xué)校的日子移情別戀于.net平臺(tái),本來想拓寬路子方便找工作,后來找到的工作就是做WebApplication的(.net),其實(shí)關(guān)注C#和.net已經(jīng)有半年了,因此上手也還好,憑借著舊有的知識繼續(xù)闖蕩,不想爭論C++還是C#好,但是因?yàn)楹芫脹]有在C++上有動(dòng)作了,因此也就生疏了,而且從來也沒有系統(tǒng)學(xué)習(xí)過C++,因此也就離他更遠(yuǎn)了。
            畢業(yè)設(shè)計(jì)應(yīng)該是大學(xué)階段做過的最完整的software了,因?yàn)檎业降墓ぷ魇?net的,也就將C#熟能生巧到底了。C++的路子似乎已經(jīng)被遺忘,過去還皮厚地在簡歷上寫熟悉,現(xiàn)在也許只能寫了解了。好在畢業(yè)設(shè)計(jì)我的重點(diǎn)不在于WEB本身,也不在于C#語法,而是強(qiáng)調(diào)設(shè)計(jì)思路,因此所有的重點(diǎn)從OOP開始,間或Design Pattern等知識,C#只是一個(gè)表現(xiàn)形式罷了。說老實(shí)話,.net下OOP確實(shí)比C++優(yōu)美,更多地關(guān)注于設(shè)計(jì)細(xì)節(jié)讓我對.net更有好感,微軟確實(shí)能將簡單融入開發(fā),讓復(fù)雜的事情簡單化確實(shí)讓人有更好的“用戶體驗(yàn)”。
            前陣子開始猶豫是不是要在C++方面繼續(xù)挖掘?到了公司后想過離開,但是荒廢了很多月的C++讓我不爭氣,去了一家大公司面試后發(fā)現(xiàn)C++的基本功降低太多,題目簡單到大二的時(shí)候都可以得心應(yīng)手的地步,但是對一些底層的細(xì)節(jié)已經(jīng)忘記了。不想和人爭論自己曾經(jīng)有多么優(yōu)秀,只怪自己基本功不扎實(shí)。事情已經(jīng)過去了四五個(gè)月,也沒想太多,現(xiàn)在的工作雖然不是很有挑戰(zhàn)性,但是薪酬也能夠?qū)Φ闷鹆夹模饕撬€很安逸,但是安逸給我的感覺總是有更多的不安,我習(xí)慣于充實(shí)的大腦才能夠有說話的底氣,但是我現(xiàn)在感覺有些力不從心了,還是想回到C++陣營上來,想過一段時(shí)間關(guān)于未來前景的問題,以前關(guān)注于社會(huì)變化,現(xiàn)在關(guān)心的是供需變化,.net搞壟斷估計(jì)是遲早的事,但是做.net的人似乎也多的跟米一樣,想過跑到JAVA陣營去混一片天地,但是已經(jīng)逃離了語言主導(dǎo)的我已經(jīng)不關(guān)心語言的選擇了,我會(huì)投入更多的時(shí)間和精力在設(shè)計(jì)模式、系統(tǒng)架構(gòu)、重構(gòu)等一些所謂的方法論上,只有這樣寫出來的東西才能美,才會(huì)有靈魂,關(guān)注于語言層面畢竟還是過于低級了。但是語言是問題的表達(dá)形式,沒有語言,那些方法論永遠(yuǎn)都是空想主意。C#確實(shí)能夠滿足我在設(shè)計(jì)方面的需求,這一點(diǎn)不容否認(rèn),而且工作需要,我不會(huì)放棄它,而且我會(huì)繼續(xù)在上面不斷表現(xiàn)我設(shè)計(jì)上的學(xué)習(xí)研究成果,我想這些基于經(jīng)驗(yàn)的東西比基于技術(shù)的東西更加富有價(jià)值。但是整體方向的選擇還是有一定必要的,前些日子想了一下,Windows的開發(fā)人太多了,競爭壓力遠(yuǎn)比技術(shù)壓力大,想過換平臺(tái),也許只有Unix有更好的企業(yè)市場,似乎能夠瞄準(zhǔn)電信行業(yè)而去,C++必然是這個(gè)方面的必需品??紤]過未來的中國市場和國際行情,嵌入式開發(fā)(更多的重點(diǎn)被我放在了手機(jī)平臺(tái)的開發(fā)上),一切都才剛剛起步,至少國內(nèi)是個(gè)步履蹣跚的地步,這個(gè)市場會(huì)需要很多的人才,C++應(yīng)該仍然有強(qiáng)大的市場,雖然.net已經(jīng)深入手機(jī)平臺(tái),所謂的跨平臺(tái)還是基于平臺(tái)的應(yīng)用軟件,雖然這方面的需求在未來一定很大,但是入門門檻并不高,Winform的朋友很容易就轉(zhuǎn)過去,.net的跨平臺(tái)性讓大家都不失業(yè),但是大家都沒有高薪了,現(xiàn)在.net的工作應(yīng)該也是一個(gè)轉(zhuǎn)型的資本,我希望在底層方面有所拓展,因此C++仍然是必須。
            C++與我的過去。過去還是喜歡所見即所得吧,畢竟拿底層入門有點(diǎn)浪費(fèi)體力不討好。學(xué)了N年的C語言,仍然只能用于大學(xué)的課程,C語言的知識其實(shí)很重要,但是現(xiàn)在卻忘記地差不多了,很想把手頭的那本C語言看一遍,當(dāng)年期末復(fù)習(xí)通讀也就兩天不到,但是總是各種各樣的原因阻礙了我的學(xué)習(xí),或許我真的打心眼里不想看它吧。之后學(xué)習(xí)了VC++也是以MFC為核心進(jìn)行展開,我用MFC又是喜歡于做一些應(yīng)用軟件,比如本文第一句話提到的兩個(gè)家伙。其實(shí)現(xiàn)在要做應(yīng)用軟件,用.net一定更好,因?yàn)榇_實(shí)開發(fā)起來很方便,性能上并沒有必要追求C++,不過說起來慚愧,我還是希望用我在Web上的工作經(jīng)驗(yàn)去主導(dǎo)我在Winform的開發(fā),畢竟Web比Winform更繁瑣,業(yè)務(wù)邏輯和更底層我已經(jīng)習(xí)慣于用類庫來描述,因此Web和Win對我的差異就更小,我可以直接放棄表現(xiàn)層而仍然能夠有所作為,至少我認(rèn)為可以這么做。MFC是C++的經(jīng)典,我想挖掘它更底層的東西,畢竟C++所能做的東西.net不一定能做。
            昨天猶豫了很久還是決定從C++的語法開始系統(tǒng)的學(xué)習(xí),用C++來表現(xiàn)設(shè)計(jì)我已經(jīng)力不從心,我得讓自己先有表達(dá)能力,然后才能抉擇更多,以后是針對UNIX還是Embeded C++就得另作打算了,但是所有的核心不會(huì)變,更多地體現(xiàn)設(shè)計(jì)的理念,雖然將應(yīng)用軟件思想來對付底層開發(fā)或許不太可取,我想面向底層總不能沒有設(shè)計(jì)吧?這些細(xì)節(jié)再做討論。以后的日子無論C#還是C++一個(gè)都不能少一個(gè)也不會(huì)少,時(shí)間要充分地利用起來,付出才會(huì)有收獲,我不想做只說不做的人。
            昨晚到當(dāng)當(dāng)訂購了兩本書,一本是C++ Primer中文版(第4版)、重構(gòu)-改善既有代碼的設(shè)計(jì),這兩本書也是我現(xiàn)在最想品味的,曾幾何時(shí)發(fā)現(xiàn)自己不是不愛看書,而是沒有找到喜歡看的書,第一本將為我復(fù)習(xí)補(bǔ)充我曾經(jīng)非系統(tǒng)地學(xué)習(xí)C++的知識,后一本將繼續(xù)為我的設(shè)計(jì)創(chuàng)造新的動(dòng)力。加油,不放棄,永不言?。?/p>

            posted @ 2007-06-05 10:27 volnet 閱讀(1618) | 評論 (9)編輯 收藏

            [知識庫][轉(zhuǎn)載]十年MFC經(jīng)歷認(rèn)識的Microsoft技術(shù)(ZT)

            知識庫(KnowledgeLibrary) ?

            固定鏈接http://www.shnenglu.com/mymsdn/category/3173.html


            文章標(biāo)題:十年MFC經(jīng)歷認(rèn)識的Microsoft技術(shù)(ZT)
            關(guān)鍵字:MFC、Microsoft、技術(shù)對比、技術(shù)發(fā)展
            轉(zhuǎn)載自http://blog.vckbase.com/hangwire/archive/2005/05/26/5806.html
            作者:hangwire
            發(fā)表時(shí)間:2005-05-26 09:13


            一、初識MFC

              我最初知道MFC大概是在1993年,那個(gè)時(shí)候Visual C++還沒面世,當(dāng)時(shí)Microsoft的C++編譯器還很弱,官方的名字是Microsoft C/C++ 7.0,MFC的版本是1.0,幾乎沒有引起什么反響,那個(gè)時(shí)期最好的C++開發(fā)環(huán)境是Borland C++ 3.1,其實(shí),大概是1992年11月份,一個(gè)偶然的機(jī)會(huì),我領(lǐng)略到Borland公司的厲害,記不得在什么地方,我看到一個(gè)絕妙的集成開發(fā)環(huán)境,即Turbo C++ 3.0 for Windows,這是我記憶中第一個(gè)真正的Windows環(huán)境下的C++集成開發(fā)環(huán)境,那種激動(dòng)的感覺至今仍記憶猶新,不客氣的說,當(dāng)時(shí)至少在C++方面,Microsoft與Borland不是一個(gè)水平的,Borland明顯的要高于Microsoft ,Borland的產(chǎn)品在技術(shù)上給我留下深刻的印象。那個(gè)時(shí)候Microsoft最好的開發(fā)平臺(tái)是Visual Basic 3.0,而Borland的Delphi正處于開發(fā)階段(Delphi 的代碼名稱是:"VB Killer")……,想起這些十幾年前的往事,我不禁感慨萬千。

              十幾年來,我用過許多開發(fā)環(huán)境,關(guān)于Visual Basic,我用過最早的DOS版本,Windows版的Visual Basic我基本上全都用過,至今我還記得每個(gè)版本的VB安裝盤磁盤的盤數(shù)。同樣,我用過各個(gè)版本的Delphi,特別是Delphi 2.0,給我留下極好的印象。Delphi提供真正編譯的可視化開發(fā)環(huán)境,那個(gè)時(shí)候(1994年左右),Delphi就可以開發(fā)帶有GUI的動(dòng)態(tài)鏈接庫,你可以想象,在Microsoft Access 2.0的應(yīng)用程序中可以加載一個(gè)Delphi Form并進(jìn)行程序交互,那種感覺真是棒極了。

              Borland C++是我心中無法抹掉的遺憾,從Turbo C到C++ Builder,我深刻的體驗(yàn)到Borland的輝煌和無奈,Delphi從VB Killer走到為VB護(hù)航(你可以想象Delphi一步到位的ActiveX 控件開發(fā)技術(shù)有多牛,早期的VB有多土,早期的VB不能開發(fā)動(dòng)態(tài)鏈接庫,因此無法開發(fā)ActiveX 控件,想起來真令人噓唏不已),Borland C++的命運(yùn)也是不濟(jì)。Borland C++ 3.1的輝煌永遠(yuǎn)不再了,十幾年的開發(fā)工作中,我在C++上投入了大量的精力,Borland C++曾經(jīng)給我?guī)頍o數(shù)的激動(dòng),然而這個(gè)經(jīng)典的名字卻在與Microsoft的競爭中漸漸的流逝了……。

              MFC4.0的出現(xiàn),使得人們感覺Microsoft在C++方面趕上來了,這一版的MFC是Win95推出后出現(xiàn)在Visual C++ 4中(Microsoft沒有VC 3,VC4以前的版本是2.2、2.1、2.0、1.51、1.5、1.0)。也許是對Borland C++的潛意識的失望,我不知不覺的接受了MFC,VC 4.2推出時(shí),我通過正常渠道購買了這個(gè)編譯器的企業(yè)版。

            二、關(guān)于Microsoft

              關(guān)于Microsoft,有無數(shù)的人要對這個(gè)名字?jǐn)⒄f感覺,這個(gè)令人討厭的名字!不知道是喜歡還是憎惡,你是程序員,你的心思可能就要因Microsoft的存在而動(dòng),即使你用Linux,你可能也是因?yàn)镸icrosoft技術(shù)因素。多少年來,這個(gè)名字每天都出現(xiàn)在你、我、他的面前,因?yàn)槟悴坏貌幻鎸indows的存在,可是你憎恨這個(gè)名字嗎?你討厭這個(gè)名字嗎?我不知道是否已經(jīng)對這個(gè)名字麻木了。

              1998年我個(gè)人訂了Microsoft MSDN Universal 版,我開始比較全面接觸這個(gè)公司的開發(fā)技術(shù),你可以想象,1998年當(dāng)你面對上百張技術(shù)光盤的時(shí)候,你就知道什么叫做"厚度",當(dāng)我們有時(shí)說出"趕上"或 "達(dá)到"Microsoft某些產(chǎn)品的水平的時(shí)候,可能我們?nèi)狈@個(gè)公司"厚度"的真實(shí)了解。進(jìn)入MSDN,我感覺Microsoft簡直不是一個(gè)"公司",而是(或者正在形成)一個(gè)"社會(huì)"。

              當(dāng)時(shí)著名的技術(shù)網(wǎng)站http://www.codeguru.com全部的技術(shù)資料是可下載的(那個(gè)時(shí)候http://www.codeguru.com提供整個(gè)網(wǎng)站內(nèi)容下載服務(wù),大約3M左右),大名鼎鼎的

              有人說"COM"沒落了,那么就太不了解Microsoft了。在與"OpenDoc"的競爭中,"COM"是個(gè)徹底的勝利者,在與"Java"的競爭中,"COM"成功的進(jìn)化了,在這個(gè)過程中Microsoft體現(xiàn)了強(qiáng)大的吸收能力、以及無法想象的韌勁。.NET只不過是COM的"別名"而已。對于一個(gè)經(jīng)驗(yàn)豐富的C++程序員而言,.NET就是COM的進(jìn)化,而Microsoft內(nèi)部.NET就是"COM 3.0"(OLE2就是COM 2.0),而"CLR"就是一個(gè)不擇不扣的COM對象。曾經(jīng)有人問我,既然牛頓時(shí)代就奠定了基礎(chǔ)(想想著名的牛頓-萊布尼茨公式),幾百年后的今天,數(shù)學(xué)還研究"微積分"嗎?回答當(dāng)然是依然在研究!"微積分"早期是針對函數(shù)的,現(xiàn)代"微積分"是針對"流形(Manifold)、纖維叢(Fiber Bundle)"的,概念深?yuàn)W了,可是基本思想不變,只是"微積分"的思想得到合理的延拓與進(jìn)化,你了解Microsoft嗎?Microsoft Research有一批超一流的數(shù)學(xué)家在為Microsoft工作,其中一些是斐爾茲獎(jiǎng)的得主,Microsoft正在實(shí)現(xiàn)如同"微積分"進(jìn)化到"微分流形"一樣將"COM"進(jìn)化到".NET"。從科學(xué)概念角度上分析COM與Java,可能COM更全面、精確,從實(shí)現(xiàn)的成熟度上Java可能更成熟,可是你看到,Microsoft正在不緊不慢的追趕。Microsoft令人聯(lián)想起戰(zhàn)國時(shí)期的強(qiáng)秦。

              戰(zhàn)國時(shí)期的秦國,采取"遠(yuǎn)交近攻""撫弱掠強(qiáng)"等措施傲視六國,今天的Microsoft也是這樣,VB1.0時(shí),Microsoft推出"VBX"控件技術(shù),眾多的小公司得以生存,Microsoft自己不開發(fā)"VBX"組件,同樣"VBX"進(jìn)化為"OCX"時(shí),Microsoft并不十分強(qiáng)大,可是這種試探得到眾多小公司的響應(yīng)。1997年Microsoft Office 97、1998年Microsoft推出Visual Studio 6.0,給眾多中、小公司提供了生存、發(fā)展的機(jī)會(huì),例如Microsoft Office 97中集成了Visual Basic for Application 5.0,這項(xiàng)技術(shù)使得幾百家軟件開發(fā)商與Microsoft簽署了VBA技術(shù)許可協(xié)議,即使AutoDesk這樣的公司都與Microsoft簽署了這個(gè)協(xié)議,這個(gè)協(xié)議使得每個(gè)集成VBA的產(chǎn)品的給個(gè)用戶許可為Microsoft付40$的許可費(fèi),如果你了解VSIP(Visual Studio Integration Protocol)協(xié)議,以及有多少公司簽訂了VSIP協(xié)議,你就真正感覺到Microsoft的可怕;Microsoft Office 97、Visual Studio 6.0的用戶界面十分漂亮,為什么Microsoft自己的開發(fā)工具不提供類似的軟件組件?你看到眾多第三方的Microsoft盟友紛紛推出自己的界面庫以模仿Microsoft,他們不會(huì)反對Microsoft,因?yàn)樗麄円呀?jīng)形成了使得Microsoft以及這些公司得以生存的生態(tài)圈。

              Microsoft的技術(shù)儲(chǔ)備有多少,Microsoft之外的人很難說清楚,Microsoft中國公司也未必了解多少,1999年WTL類庫剛剛出現(xiàn)的時(shí)候,人們就希望WTL能得到官方的支持,或授權(quán)給一個(gè)Microsoft之外的一個(gè)公司(你能想象出Borland C++ 5.0內(nèi)置的ActiveX開發(fā)機(jī)制是基于Microsoft ATL類庫嗎?),直到今天,WTL依然如故,我們完全相信,如果Microsoft強(qiáng)力推廣WTL,WTL完全可以流行,可是Microsoft不缺類似的技術(shù),類似的類庫還有BCL(Base Control Library,一個(gè)用于開發(fā)輕量級ActiveX控件的類庫),Microsoft還有一個(gè)基于ATL的類庫,這個(gè)類庫用于開發(fā)ActiveX Designer,ActiveX Designer是絕大多數(shù)程序員不了解的一類對象,如果你熟悉Office開發(fā),你知道Office VBA 中有一類對象,即Form2,此外VB6.0 中的報(bào)表設(shè)計(jì)器(以及著名的Active Reporter),都屬于此類對象,用這個(gè)類庫,你可以為VB6.0以及集成VBA的系統(tǒng)提供定制化的可視化設(shè)計(jì)機(jī)制等等,如今ActiveX Designer已經(jīng)演化為集成于Visual Studio .NET中的設(shè)計(jì)器。

            三、向Microsoft學(xué)習(xí)

              無論從什么角度評價(jià)Microsoft,我覺得Microsoft是值得我們學(xué)習(xí)的,如果說生活在這個(gè)時(shí)代有Microsoft存在是一場災(zāi)難,你就應(yīng)該痛恨這個(gè)家伙,但你首先要向這個(gè)家伙學(xué)習(xí)!我無意為Microsoft歌功頌德,我只是想說出十幾年我對Microsoft技術(shù)的感受。

              Microsoft在研究式的開發(fā)中受益極大,如果你有興趣,你可以訪問

              在Office大戰(zhàn)中,國產(chǎn)軟件的確在一些方面與Microsoft進(jìn)行較量,其實(shí)給人的感覺很勉強(qiáng),界面上的似是而非,或用戶習(xí)慣方面的接近并不能解決根本的問題,一個(gè)好的軟件開發(fā)人員必須是一個(gè)軟件使用的高手,很難想象一個(gè)軟件操作水平很拙劣的開發(fā)人員能開發(fā)出高水平的軟件,我最早使用的軟件之一就是Microsoft Word,當(dāng)時(shí)的版本是2.0,大概是1992年的事情,給我留下深刻印象的是集成于Word中的Word Basic,后來,我接觸到Excel 3.0,不出所料,Excel中集成的是Excel Basic,后來使用的Access中自然內(nèi)置Access Basic 1.0,在這些軟件集成捆綁成Office之前,我就感覺這些產(chǎn)品的構(gòu)思十分了不起,很具有Microsoft的風(fēng)格,因?yàn)槟阒溃词故且粋€(gè)DOS,Microsoft都要提供一個(gè)內(nèi)置的QBasic或GW Basic。雖然關(guān)于Microsoft的產(chǎn)品評論很多,作為一個(gè)技術(shù)人員,我認(rèn)為Microsoft的產(chǎn)品構(gòu)思絕對是第一流的,從1994年早期的Office系列到1997年形成的Office 4.2,我認(rèn)為,技術(shù)構(gòu)思上均領(lǐng)先于我國2002年以后的Office產(chǎn)品,你聽說過如下說法嗎?"Dos 作為操作系統(tǒng)的時(shí)代,Windows是應(yīng)用軟件;Windows是操作系統(tǒng)時(shí),Office成為Dos時(shí)代的Windows;那么如果按此規(guī)律,Office會(huì)不會(huì)替代Windows而成為操作系統(tǒng)?",現(xiàn)在在開發(fā)領(lǐng)域Visual Studio( .NET)正在成為另一個(gè)Office,你注意到了嗎?控制Visual Studio( .NET)集成開發(fā)環(huán)境的仍然是一個(gè)Basic語言引擎(Visual Basic .NET)。

              與許多公司不同的是,在技術(shù)體系上,Microsoft幾乎所有的產(chǎn)品是息息相關(guān)的,Windows、Office、Visual Studio .NET雖然各不相同,但公共的核心即將形成,我們已經(jīng)看到,核心組件方面,Office與Visual Studio .NET日漸趨于一致,例如Microsoft正在將Office 2003的核心組件VBA 6.X逐步用新的Visual Studio Tools for Office替代,而我們依然在一些似是而非的現(xiàn)象上與Microsoft的產(chǎn)品比較差距,國家采購或政府采購支持的公司,不去鉆研核心技術(shù),只是急功近利的采用短期行為急于與Microsoft相爭,不知是否有蚍蜉撼樹的感覺,個(gè)人的體驗(yàn)是,先學(xué)習(xí)Microsoft,踏踏實(shí)實(shí)的學(xué),了解Microsoft,深入的了解,然后再喊口號。

            四、為什么用MFC?

              經(jīng)過若干年的競爭,Borland 的OWL幾乎消失了,這個(gè)OWL是個(gè)非常漂亮的C++類庫,在Borland C++ 3.1風(fēng)光無限的年代,OWL真正的做到了獨(dú)領(lǐng)風(fēng)騷。然而,Borland C++ 4.0錯(cuò)過了進(jìn)入32位程序的最佳時(shí)機(jī),BC 4.0推出后不久,迎來了Win95,Borland倉促上陣,以一個(gè)小的"Pack"使得BC4可以編譯基于Win4的程序,當(dāng)時(shí)的Visual C++是2.0版,支持Window16的版本為Visual C++1.51,有意思的是Borland可以用同一個(gè)編譯器同時(shí)支持Win16、Win32,而Microsoft卻不得不為Win16、Win32提供不同的編譯器。然而,非正式版本的Visual C++ 2.1與Visual C++ 2.2卻悄悄地支持了Win95的最新特征,即Win95新提供的一組公共控件,在我的印象中,Borland對Win95新特征的支持不利使得MFC與OWL的距離極大的縮短了。稍后到來的Borland C++ 4.5沒有改變這個(gè)狀況,盡管Borland C++ 5.0同時(shí)支持OWL與MFC,可是敗象已經(jīng)顯露,Borland C++非常遺憾的只走到了5.5版。C++ Builder雖然形式上引入了Delphi的VCL庫,可是許多C++程序員并不買賬,因?yàn)樵S多以C++為樂的人更喜歡以編輯的模式進(jìn)行編碼。Visual C++ 4.0的出現(xiàn),在C++這個(gè)戰(zhàn)場上,Borland開始落敗了。

              MFC發(fā)展到今天,已經(jīng)十多年了,盡管褒貶不一,但可以肯定,十幾年的技術(shù)積累已經(jīng)奠定了MFC的生存基礎(chǔ),即使Microsoft的長角發(fā)布,MFC也不能推出Windows的舞臺(tái),事實(shí)上,長角(Longhorn)之后的Visual Studio .NET仍將MFC作為一個(gè)重要的組成部分,在今年的Visual Studio .NET 2005中,MFC在C++中的位置依然如故。MFC的未來,應(yīng)該不必?fù)?dān)心,只要你深入考察.NET類庫,你會(huì)發(fā)現(xiàn),MFC的許多思想機(jī)制正悄然進(jìn)入.NET,與此同時(shí),Microsoft的第三方盟友十多年來已為MFC開發(fā)了大量的擴(kuò)展庫,如果Microsoft是船,第三方盟友就是載舟之水。許多人認(rèn)為MFC不發(fā)展了,其實(shí)是一種錯(cuò)覺,Visual C++ 6的界面十分經(jīng)典,特別是其中的Docking控制條機(jī)制,其實(shí)Visual C++ 6的IDE完全就是MFC寫的,可是MFC類庫中控制條相關(guān)的類功能很弱,為什么?你會(huì)看到許多與Microsoft友好的公司,他們很快的在MFC基礎(chǔ)上實(shí)現(xiàn)了Visual C++ 6 的Docking機(jī)制,這就是Microsoft的高明之處,Microsoft很會(huì)給盟友提供機(jī)會(huì),其一貫的做法就是在自己的商品化產(chǎn)品中預(yù)先提供一些有趣的特征,使得其他一些公司進(jìn)行模仿以帶動(dòng)用戶群體。Borland不具備這樣的儲(chǔ)備。MFC第三方市場的繁榮,得益于Microsoft的策略與明智。MFC可否跨平臺(tái)?理論上完全可以,Microsoft不做,也是策略,但是有許多重要的產(chǎn)品Microsoft卻默許MFC移植到其他平臺(tái),事實(shí)上,Microsoft的合作伙伴之一Mainsoft公司(Windows源碼就是從這家公司流失的),幾年來就是負(fù)責(zé)移植MFC程序移植到UINIX、Linux、AIX等操作系統(tǒng)之上。

              新版的Visual C++中MFC已經(jīng)支持.NET開發(fā)了,MFC與ATL的協(xié)作更好了。根據(jù)我的經(jīng)驗(yàn),MFC、ATL與.NET庫三者完全可以融合在一起綜合應(yīng)用到實(shí)際的開發(fā)工作中去,如果你是MFC行家,我希望ATL與.NET庫能成為你的忠實(shí)的左右手。那么有沒有同時(shí)支持MFC、ATL與.NET庫的程序?當(dāng)然有,Visual Studio .NET IDE就是!而且Visual Studio .NET IDE還支持用ATL與.NET庫擴(kuò)展的Addin,如果你希望用MFC管理ATL與.NET庫,請繼續(xù)支持我!

            五、認(rèn)識Application對象

              如果你熟悉Microsoft Office,你應(yīng)該進(jìn)一步的剖析這個(gè)大型軟件,Microsoft Office中幾乎每個(gè)程序都是可二次開發(fā)的,這一點(diǎn)得益于Microsoft Office內(nèi)置的二次開發(fā)機(jī)制,一個(gè)是基于COM機(jī)制的VBA模型,另一個(gè)是基于.NET框架的托管模型:Visual Studio Tools for Office。作為一名程序員,你應(yīng)當(dāng)在技術(shù)角度解析Office的技術(shù)結(jié)構(gòu)。Microsoft的大多數(shù)軟件的對象結(jié)構(gòu)可以通過Visual Studio提供的工具OLE/COM Object Viewer考察其類型庫得到,通過引用類型庫,你甚至可以得到描述對象信息的C++頭文件。這樣做真是好處多多。一個(gè)典型的Office通常都有一個(gè)Application對象(或其他一個(gè)與之相當(dāng)?shù)膶ο螅?,這個(gè)對象相當(dāng)于軟件樞紐,在這里,我們不討論Office,借此話題說說Application對象。大多數(shù)支持?jǐn)U展(Addin、Plugin)的軟件都存在類似的構(gòu)造。通常,一個(gè)系統(tǒng)得Application對象或者是一個(gè)COM對象,或者是一個(gè).NET對象,如果你的系統(tǒng)存在這類對象,你的系統(tǒng)就基本具備支持Addin、Plugin的機(jī)制了。一個(gè)理想的做法就是在一個(gè)MFC系統(tǒng)中,內(nèi)置一個(gè)ATL對象或.NET對象,稍后我們給出方案如何做到這一點(diǎn)。設(shè)計(jì)Application對象的關(guān)鍵是如何規(guī)劃這個(gè)對象的屬性、方法、事件。如果你希望系統(tǒng)具備良好的擴(kuò)展性,Application對象是十分關(guān)鍵的,這也是構(gòu)架藝術(shù)的體現(xiàn)。所謂Addin(Plugin),是系統(tǒng)運(yùn)行時(shí)根據(jù)需要加載的對象庫,Addin(Plugin)之所以可以擴(kuò)展系統(tǒng),關(guān)鍵的因素就是系統(tǒng)加載Addin(Plugin)時(shí),將Application對象傳遞給Addin(Plugin)庫,設(shè)想一下,如果Application恰到好處的觸發(fā)了系統(tǒng)事件,而Addin(Plugin)庫如愿的解釋了事件,一個(gè)Addin(Plugin)庫的任務(wù)不就OK了嗎!因此Application對象是系統(tǒng)設(shè)計(jì)的關(guān)鍵。

              如果你精通ATL對象,在你的MFC系統(tǒng)中添加一個(gè)ATL對象,這個(gè)任務(wù)可以用VC Wizard完成。你已經(jīng)接受了一個(gè)事實(shí),就是MFC程序中存在一個(gè)CXXXApp對象(CWinApp的派生類),現(xiàn)在你要做的是增加一個(gè)對應(yīng)得ATL對象。這個(gè)對象可以在CXXXApp::InitInstance()中創(chuàng)建,如果ATL對象的類是CXXXAppObject,建議你在CXXXApp對象對象中增加一個(gè)成員變量,例如:CComObject<CXXXAppObject>* m_pAppObj,然后可以入下初始化m_pAppObj:

            m_pAppObj = new CComObject<CXXXAppObject>;

              注意程序結(jié)束時(shí)在CXXXApp::ExitInstance()中釋放m_pAppObj,語句如下:

            delete m_pAppObj;

              你可以將系統(tǒng)得關(guān)鍵屬性設(shè)置成CXXXAppObject的屬性,例如系統(tǒng)得標(biāo)題、是否為多文檔等等。系統(tǒng)希望外部調(diào)用的功能可以實(shí)現(xiàn)為CXXXAppObject的方法,這一點(diǎn)取決于你的需要。系統(tǒng)需要外部擴(kuò)展的功能,表現(xiàn)為CXXXAppObject的事件,關(guān)鍵是在恰當(dāng)?shù)奈恢糜|發(fā)事件以及提供的事件參數(shù)。例如,你可以在CXXXApp::InitInstance()觸發(fā)應(yīng)用程序開始的事件OnStartUp,Plugin捕獲事件后,可以進(jìn)行特定的初始化(身份確認(rèn)、初始信息查詢等等);你可以在CXXXApp::ExitInstance()觸發(fā)應(yīng)用程序結(jié)束事件,Plugin捕獲事件后,處理用戶需要的系統(tǒng)退出工作。所有的設(shè)計(jì)取決于具體設(shè)計(jì)。

              如何加載Plugin,是一個(gè)有趣的問題,如果Plugin實(shí)現(xiàn)為一個(gè)COM范疇(Category),可以運(yùn)用COM技術(shù)枚舉這個(gè)Category;可以將Plugin安裝到一個(gè)特定目錄,也可以通過注冊表。Plugin的實(shí)現(xiàn)可以用COM技術(shù)、也可以用.NET框架。適當(dāng)?shù)臋C(jī)會(huì)我會(huì)提供例子……

            六、后記

              一時(shí)心血來潮,就寫了這篇文章,很難說是有心,還是無意。幾天前我在新浪網(wǎng)上看應(yīng)氏杯圍棋決賽,我覺得該贏了吧,作為一個(gè)圍棋迷,我們等了十幾年,等到了屬于國人的應(yīng)氏杯。記得7、8年前在還在大學(xué)工作的時(shí)候,有一次,一位同事興致沖沖的走道我面前對我說:"嗨,昨天馬XX贏了李昌鎬!",當(dāng)時(shí)我在系辦公室正在看報(bào)紙,那位仁兄見我頭都沒抬,非常不滿的搶下報(bào)紙,對我吼道:"喂!馬XX贏了李昌鎬?。∧懵牭?jīng)]有?。?!",我對他說:"你大驚小怪個(gè)啥?!馬XX輸了李昌鎬多少盤,你知道嗎?",馬XX幾乎一直在輸給李昌鎬,人們已經(jīng)不奇怪了,偶爾贏一次,國人就把他捧得北都找不到了,李昌鎬弱冠17的時(shí)候就傲視這個(gè)世界了,可至今面孔不變,幾天前的農(nóng)心杯,中日聯(lián)軍5個(gè)人,被他打個(gè)落花流水,李昌鎬是公認(rèn)的世界第一,以至于有的高手知道下一個(gè)對手如果是他,就會(huì)去訂回程機(jī)票。這次應(yīng)氏杯,國人竟然感謝崔哲瀚,何也?因?yàn)檫@個(gè)弱冠19的小子,擋住了他的大哥李昌鎬才使得應(yīng)氏杯有了懸念。當(dāng)國人媒體在說韓國僅李昌鎬一人厲害的時(shí)候,不知道是出何居心還是自欺欺人,李昌鎬年方30,不知道要力壓中、日多少年!面對這個(gè)名字,真有點(diǎn)麻木了,這個(gè)太極虎!

              軟件界又來了我們一向不齒的印度虎,2001年我們的軟件出口額僅是印度的四十分之一,我們震驚了,怎么可能呢?這個(gè)四十分之一水分很大,很可能更可憐!當(dāng)時(shí)我在大連參加一個(gè)關(guān)于"大連軟件出口國內(nèi)第一"的官方會(huì)議,那位大人在會(huì)上說:"據(jù)說,我們大連軟件出口國內(nèi)排名第一,市有關(guān)領(lǐng)導(dǎo)希望今天的會(huì)議給出這個(gè)第一的數(shù)字依據(jù),希望你們把數(shù)據(jù)報(bào)上來,去年的數(shù)據(jù)也可申報(bào),注意,我們要的只是數(shù)據(jù),你們仔細(xì)體會(huì),我們根據(jù)數(shù)據(jù),有獎(jiǎng)勵(lì),機(jī)會(huì)難得呀!"……。某一天,幾個(gè)朋友在我家看央視的對話節(jié)目,對話一方為國內(nèi)的軟件大鱷們(用友、阿爾派等公司的老總們),另一方為印度軟件的一個(gè)代表團(tuán)。當(dāng)問及中、印軟件差距的時(shí)候,我們的劉老總(代表阿爾派)不以為然的說,據(jù)他的看法,我們已經(jīng)快趕上(印度)了,……,言下之意頗有印度的水平不過如此的感覺,印度方的話我至今記憶猶新:"是否趕上,國際市場說的算!在中國看來,印度程序員的個(gè)性不足,技術(shù)也不怎么樣,其實(shí)是個(gè)錯(cuò)覺,印度軟件首先注重個(gè)性,許多重要的美國商品化軟件都是在印度本土開發(fā)的……",我們的輿論總是將印度程序員的水平描述的平庸至極,可是差距日漸拉開,……,圍棋、足球(不好意思談,談不出口?。④浖?,我們被近鄰嚴(yán)酷的封鎖了,樂壞了記者們、給媒體帶來了生機(jī)……

              日本江戶時(shí)代的圍棋,如果一個(gè)人要想世襲一個(gè)稱號(例如:本因坊),他必須戰(zhàn)勝所有的師兄弟,然后,住進(jìn)師父家的內(nèi)室,你知道以后的事情嗎?以后,這個(gè)棋手,就得為師父一家做飯、帶孩子、搞衛(wèi)生……,其余的門人則一心一意的下棋,這樣的人、方式,造就了一代一代的本因坊,他們的棋譜大多數(shù)都流芳至今,這就是早期日本圍棋的悟道模式。軟件總共有多少語句?我最早接觸的計(jì)算機(jī)軟件教材是一本英文版的(影印的D版),不同于我們,那本書的作者構(gòu)造了"X-語言",他們不講什么C、Pascal、Basic,一旦缺了什么機(jī)制,就給"X-語言"添加些成分。什么C、Pascal、Basic,你感覺差不多,但現(xiàn)在卻分出了等級!我們駕馭語言的能力弱得很,可是我們在語言的細(xì)微之處卻很講究,不知道對不對,許多程序員也許是出于虛榮而用C++,事實(shí)上,地球人到知道,做數(shù)據(jù)庫,Delphi、VB遠(yuǎn)比C++勝任,鋪天蓋地的C++的書,寫的東西幾乎雷同,因?yàn)?,有用的或者作者不寫、或者作者不懂。有時(shí)我在想,如果國內(nèi)沒有內(nèi)需,會(huì)怎樣?也許軟件內(nèi)需的存在,造就了中國軟件的特色,我認(rèn)為國內(nèi)業(yè)界并沒有充分利用中國軟件內(nèi)需的存在,也許中國軟件內(nèi)需的存在是軟件落后的硬傷。

              我記得一部電影《神辮》,那個(gè)英雄的大辮子被洋人炸掉了,最終他成了神槍手,戰(zhàn)勝洋人用大刀、秘籍是不行的,用洋的東西戰(zhàn)勝洋的技術(shù)才是正道。我覺得,一個(gè)好的程序員必須了解軟件的歷史,學(xué)習(xí)歷史,你知道你為什么弱,別人是如何強(qiáng)大的。我們正在另一個(gè)戰(zhàn)場上抗美(可笑的是我們卻要趕超印度!),無論Microsoft、Borland如何爭斗,無論他們誰統(tǒng)治誰,他們不影響美國的強(qiáng)大,朋友們,學(xué)習(xí)Microsoft,開發(fā)出讓國人感到牛的軟件!

            posted @ 2006-12-04 22:05 volnet 閱讀(727) | 評論 (0)編輯 收藏

            CListCtrl(List Control)綁定ODBC數(shù)據(jù)庫的方法。(附加:CRecordset::Open()與CRecordset::OpenEx()區(qū)別之真實(shí)體驗(yàn)~)

            今天懷著虞城的心來探索打印CListCtrl的方法,可惜忙到現(xiàn)在被老掉牙的數(shù)據(jù)加載給絆倒。但是從中卻學(xué)到了不少新東西,以前沒有遇到過的。現(xiàn)在就寫出來和大家分享。
            ODBC數(shù)據(jù)源與CListCtrl的連接已經(jīng)算是老生常談的事情了。
            1、先建立數(shù)據(jù)庫(這里以一個(gè)PrintTest為數(shù)據(jù)源名來處理,該數(shù)據(jù)庫包含一張表info,里面有四個(gè)字段,ID,NAME,GROUP,AGE,只是測試用因此隨便列出幾個(gè)字段,其中ID為數(shù)字類型,其余為文本,采用Access數(shù)據(jù)庫來建立。方法就是添加一張表,然后分別對表中填充一些數(shù)據(jù),這里就不再講述?。?br />2、ODBC數(shù)據(jù)源與程序的連接
            ???a.在stdafx.h文件的尾部添加#include "afxdb.h"
            ???b.針對于整個(gè)工程的全局函數(shù)CDatabase db;
            ???c.在APP文件的初始化進(jìn)程中添加打開數(shù)據(jù)庫的語句
            ?????????

            ????CWinApp::InitInstance();???? // 此句為系統(tǒng)自動(dòng)生成的;

            ????
            if ?( ! db.IsOpen())
            ????????db.Open(
            " PrintTest; " );
            ????
            else
            ????????AfxMessageBox(
            " 數(shù)據(jù)庫連接失??! " );

            ????AfxEnableControlContainer();????
            // 此句為系統(tǒng)自動(dòng)生成的;

            至此,與數(shù)據(jù)庫的連接基本上完成了,也正是因?yàn)檫@個(gè)db.Open("PrintTest;");才有了這篇文章。
            3、向記錄集(CRecordset)填充數(shù)據(jù),在這里我們必須要談到(數(shù)據(jù)庫和記錄集對象之間的)記錄字段交換 (RFX)。(大家可以在MSDN中查閱相關(guān)信息。)現(xiàn)在只將步驟做一個(gè)簡述:
            ???a.在“類視圖”中添加類,然后選擇“MFC ODBC 使用者”;
            ???b.在向?qū)е?,?shù)據(jù)源按鈕后選擇“機(jī)器數(shù)據(jù)源”選擇我們設(shè)置的ODBC數(shù)據(jù)源,這里為PrintTest;確定;
            ???c.在彈出的對話框中選擇info表,確定;
            ???d.修改類名,文件名(如果有必要的話),這里改為CInfoRS,InfoRS.h,InfoRS.cpp
            ???e.注意下面的選擇是“動(dòng)態(tài)集”,確定。(警告關(guān)閉)
            這時(shí)候你可以在類向?qū)е锌吹教砑拥男骂?,CInfoRS
            4、在初始化對話框的時(shí)候進(jìn)行數(shù)據(jù)的讀入。
            值得注意的是:我們剛才定義的是全局的變量,但是定義的語句是在APP文件中寫入的,因此在Dlg文件中調(diào)用的時(shí)候我們?nèi)匀恍枰ヂ暶饕幌滤侨肿兞浚簿褪菍lg來說,它是在外部已經(jīng)定義過的變量。因此在Dlg.cpp的開頭我們補(bǔ)充extern CDatabase db;
            在BOOL CPrintListCtrlDlg::OnInitDialog()中添加

            ???? // ?TODO:?在此添加額外的初始化代碼 // 注意找到該函數(shù)中的這句話,在其后添加以下代碼
            ????m_cList.SetExtendedStyle(LVS_EX_GRIDLINES);?????? // 設(shè)置ListCtrl的風(fēng)格
            ???? int ?nWidth = 110 ;
            ????m_cList.InsertColumn(
            0 , " 會(huì)員編號 " ,LVCFMT_LEFT,nWidth * 2 / 3 );
            ????m_cList.InsertColumn(
            1 , " 會(huì)員姓名 " ,LVCFMT_LEFT,nWidth);
            ????m_cList.InsertColumn(
            2 , " 會(huì)員組織 " ,LVCFMT_LEFT,nWidth * 3 / 2 );
            ????m_cList.InsertColumn(
            3 , " 年齡 " ,LVCFMT_LEFT,nWidth / 2 );
            ????CInfoRS?rs(
            & db);

            ????UpdateList(rs);


            在這個(gè)應(yīng)用程序中同樣要注意到,因?yàn)槲覀冃枰氖且粡堫愃艫ccess表的表格,而不是類似我的電腦的圖標(biāo)形式的風(fēng)格,因此我們需要在添加的ListControl的時(shí)候,將其屬性中的View設(shè)置為Report。

            ?UpdateList(rs);是我們自己添加的一個(gè)函數(shù),再此我再介紹一下使用類向?qū)砑雍瘮?shù)的方法。
            在類視圖中,右鍵,添加->添加函數(shù),然后添加相關(guān)參數(shù),比如返回值類型,參數(shù)類型等,記得添加參數(shù)的時(shí)候按“添加”將其添加到參數(shù)列表中。
            下面列出UpdateList的代碼:

            void ?CPrintListCtrlDlg::UpdateList(CInfoRS & ?rs)
            {
            ????
            int ?i = 0 ;
            ????CString?strID;
            ????rs.Open();
            ????m_cList.DeleteAllItems();
            ????
            while ( ! rs.IsEOF())
            ????
            {
            ????????m_cList.InsertItem(i,
            "" );
            ????????strID.Format(
            " %d " ,rs.m_ID);
            ????????m_cList.SetItemText(i,
            0 ,strID);
            ????????m_cList.SetItemText(i,
            1 ,rs.m_NAME?);
            ????????m_cList.SetItemText(i,
            2 ,rs.m_GROUP);
            ????????m_cList.SetItemText(i,
            3 ,rs.m_AGE);
            ????????rs.MoveNext();
            ????????i
            ++ ;
            ????}

            ????rs.Close();
            }
            至此這個(gè)程序基本上就編寫完成了,但是使用Ctrl+F5調(diào)試的時(shí)候出現(xiàn)了錯(cuò)誤。錯(cuò)誤具體就不再描述,只告訴解決的方法。
            1、一個(gè)是CInfoRS類中一句#error Security Issue: The connection string may contain a password
            解決方法:注釋掉
            2、類型不匹配:
            ??m_cList.SetItemText(i,1,rs.m_NAME );
            ??m_cList.SetItemText(i,2,rs.m_GROUP);
            ??m_cList.SetItemText(i,3,rs.m_AGE);
            將提示rs.m_NAME,rs.m_GROUP,rs.m_AGE不能從“CStringW”轉(zhuǎn)換為“LPCTSTR”
            解決方法:在類視圖中定位到CInfoRS,在其變量(藍(lán)色方塊后),隨便點(diǎn)一個(gè)進(jìn)入。按以下方法修改:
            //將以下代碼:
            ????long????m_ID;
            ????CStringW????m_NAME;
            ????CStringW????m_GROUP;
            ????CStringW????m_AGE;
            //修改為:
            ????long????m_ID;
            ????CString????m_NAME;
            ????CString????m_GROUP;
            ????CString????m_AGE;
            //即將這里的CStringW替換為CString


            //其實(shí)可以注意到之前的一大段話:以下字符串類型(如果存在)反映數(shù)據(jù)庫字段(ANSI 數(shù)據(jù)類型的 CStringA 和 Unicode數(shù)據(jù)類型的 CStringW)的實(shí)際數(shù)據(jù)類型。這是為防止 ODBC 驅(qū)動(dòng)程序執(zhí)行可能不必要的轉(zhuǎn)換。如果希望,可以將這些成員更改為CString 類型,ODBC 驅(qū)動(dòng)程序?qū)?zhí)行所有必要的轉(zhuǎn)換。(注意: 必須使用 3.5 版或更高版本的 ODBC 驅(qū)動(dòng)程序以同時(shí)支持 Unicode 和這些轉(zhuǎn)換)。
            至此,編譯通過。
            但是,隨后彈出錯(cuò)誤:ODBC數(shù)據(jù)源不支持動(dòng)態(tài)集
            修正這個(gè)問題的方法有二:
            一、在剛才添加的時(shí)候,將動(dòng)態(tài)集(默認(rèn))改為快照,在這里,將不會(huì)出現(xiàn)錯(cuò)誤。
            二、令人慶幸的是我曾經(jīng)做過一個(gè)例子,里面確實(shí)是使用動(dòng)態(tài)集,但并沒有出現(xiàn)這個(gè)錯(cuò)誤,于是我找到了另一個(gè)程序,再次調(diào)試通過。于是就很是郁悶。于是用斷點(diǎn)調(diào)試,最終確定問題是發(fā)生在rs.Open();的位置。
            于是查找MSDN發(fā)現(xiàn)(For CRecordset, the default value is CRecordset::snapshot.翻譯:對于CRecordset默認(rèn)值類對象,默認(rèn)值是 CRecordset::snapshot,也就是快照模式),而我們所用的是動(dòng)態(tài)集的模式。這里可以將rs.Open();改為rs.Open(CRecordset::forwardOnly);再次編譯就可以通過了。
            另外可以將最初的db.Open("PrintTest;");改為db.OpenEx("DSN=PrintTest;");就可以解決問題了。這其中的奧妙就不是很清楚,只能當(dāng)作經(jīng)驗(yàn)來和大家分享一下。也希望有知道的人能夠留言告訴我。謝謝先~!


            以下將本示例的代碼以及數(shù)據(jù)庫打包供大家學(xué)習(xí)下載!
            http://www.shnenglu.com/Files/mymsdn/PrintListCtrl.rar

            附錄:
            1、編譯調(diào)試:Visual Studio.NET 2003中文版
            2、在主對話框需要添加一個(gè)ListControl的控件。(下載的代碼可能還多包括一個(gè)打印控件,但該控件的功能并未實(shí)現(xiàn),只是一個(gè)預(yù)留的測試功能。大家自行練習(xí)的時(shí)候可以不添加該按鈕。)

            posted @ 2006-09-18 02:07 volnet 閱讀(3751) | 評論 (0)編輯 收藏

            如何利用MFC建立的對話框應(yīng)用程序中一鍵實(shí)現(xiàn)對CListCtrl(List Control控件)列表的表格打???

            如何利用MFC建立的對話框應(yīng)用程序中一鍵實(shí)現(xiàn)對CListCtrl(List Control控件)列表的表格打印?
            這是一個(gè)讓我覺得郁悶的問題:
            問題描述:
            1、常規(guī)利用一個(gè)MFC對話框應(yīng)用程序?qū)崿F(xiàn)一個(gè)數(shù)據(jù)庫管理系統(tǒng)
            2、在完成查詢后,希望能夠打印出結(jié)果。
            3、為了簡化功能,實(shí)現(xiàn)打印功能,將僅實(shí)現(xiàn)基本打印功能。
            思路分析:
            1、CListCtrl類是派生于CListView類的類,而CListView類又是從CView類派生的。因此可以利用CView類的打印功能來輸出相關(guān)數(shù)據(jù)。(找到了成功的打印模型)
            2、……
            參看參考文章:打印CView類文章.rar(http://www.shnenglu.com/Files/mymsdn/打印CView類文章.rar)

            本文章并未實(shí)踐過,請高手分析一下思路是否可行,該套用是否可行以及潛在的難點(diǎn)。

            posted @ 2006-09-17 14:13 volnet 閱讀(3295) | 評論 (2)編輯 收藏

            用文檔序列化來保存打開文件[理論聯(lián)系實(shí)際]

                 摘要: 文檔與序列化 一、文檔的基本特征 文檔類文件是從CDocument繼承而來的。 ...  閱讀全文

            posted @ 2006-08-16 23:19 volnet 閱讀(2442) | 評論 (0)編輯 收藏

            僅列出標(biāo)題
            共9頁: 1 2 3 4 5 6 7 8 9 
            特殊功能
             
            丁香五月网久久综合| 久久不见久久见免费视频7| 久久精品www| 国产精品一区二区久久| 久久免费美女视频| 久久精品草草草| 久久久久久午夜精品| 精品久久人妻av中文字幕| 99久久久久| 久久综合给合久久狠狠狠97色69| 精品久久久久久久久中文字幕| 性做久久久久久久久老女人| 久久精品久久久久观看99水蜜桃| 精品无码久久久久国产| 久久只这里是精品66| 久久久久国产精品| 久久人人爽人人爽人人片av高请| 久久99精品久久久久久9蜜桃| 99精品国产99久久久久久97| 久久精品国产精品亚洲艾草网美妙| 久久综合噜噜激激的五月天| 久久久精品日本一区二区三区| 午夜精品久久久久久中宇| 亚洲精品无码久久久久AV麻豆| 国产精品伦理久久久久久| 久久综合久久久| 精品亚洲综合久久中文字幕| 久久天天躁狠狠躁夜夜躁2O2O| 国产精品久久久久蜜芽| 欧美色综合久久久久久| 久久婷婷人人澡人人| 日韩一区二区久久久久久| 久久99热这里只有精品国产| 久久精品不卡| 久久精品一区二区影院| 国产精品va久久久久久久| 一级做a爱片久久毛片| 国产精品99久久不卡| 久久亚洲高清综合| 无码八A片人妻少妇久久| 97精品依人久久久大香线蕉97|