青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

MyMSDN

MyMSDN記錄開發新知道

#

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

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

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

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

[學習筆記]C++ Primer[第二章]基本語言

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

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

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

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

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

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

#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創建的)

印象中以上代碼的標準庫似乎在VS2005創建的ConsoleApplication下已經無法編譯了。

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

打開后就出現了命令提示窗口:(我的程序放在E盤底下的CPP文件夾內,命名為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++ 優化編譯器 14.00.50727.762 版
版權所有(C) Microsoft Corporation。保留所有權利。

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

這時候進入文件夾也可以看到多了兩個文件prog1.exe和prog1.obj

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

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

[學習筆記]C++ Primer[第一章]快速入門

[目的]

記錄C++ Primer學習中遇到的需要記憶的東西,這里僅以我個人為標準進行記錄。

[格式]

以下樣例代表了本文所描述的所有摘要片段將通過以下模版進行創建。

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

[正文]

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

在書中提到的
C:\directory> cl -GX prog1.cpp
命令在利用VS2005所帶的32位C/C++優化編譯器下會出現如下提示:

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

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

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

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

不盡的想法,不夠的時間

今天收到當當網寄過來的C++ Primer感覺興奮的同時又開始擔心。

記得前兩天寫下學習計劃這樣的文章,將未來設計地如此“完美”,但今天拿到書后又一陣壓力壓得我喘不過氣來,七百多頁的書握在手上著實又厚實了許多,但給我帶來的不是“踏實”的感覺,而是壓力。當年在校可以一天窩在圖書館看書,800多頁的書也就一頁一頁地啃下來了,前后也就兩個月多,而且效率還挺高的。但現在看這本大部頭就讓我覺得壓力,每天工作之余也挺累的,真不知道自己該如何堅持高效地完成這本書,其實在我看來,高效地看書比單純意義上的看書是更值得關注的。

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

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

2、建議在效率高的時候看書,看書切忌為了數量而不追求質量,有的時候可能你很困或者注意力很難集中,那切忌不要看,因為看了等于沒看,而似乎又不愿意回頭再看,這樣將浪費那部分內容。

3、看書不提倡做小動作,之所以說不提倡是因為我將說“比如拿個筆晃來晃去”,因為這個習慣很多人都有,但是有的人受影響小,有的人則完全分心了。

4、看書一定要抓住重點多看幾眼,以前看書經常看后不知所云,后來發現需要多關注重點,雖然不是每個字都要記住,但是重點部分一定要多看幾眼,至于重點是什么,我想抱著求學的態度去認真看,重點不難找出。記得要多斟酌幾遍,有什么可以隨手記在邊上。

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

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

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

以上是我個人對看書的一點小小的心得。

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

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

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

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

【學習計劃】C#與C++并行生存,為了設計,為了工作,為了生活,為了……

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

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

[知識庫][轉載]十年MFC經歷認識的Microsoft技術(ZT)

知識庫(KnowledgeLibrary) ?

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


文章標題:十年MFC經歷認識的Microsoft技術(ZT)
關鍵字:MFC、Microsoft、技術對比、技術發展
轉載自http://blog.vckbase.com/hangwire/archive/2005/05/26/5806.html
作者:hangwire
發表時間:2005-05-26 09:13


一、初識MFC

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

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

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

  MFC4.0的出現,使得人們感覺Microsoft在C++方面趕上來了,這一版的MFC是Win95推出后出現在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推出時,我通過正常渠道購買了這個編譯器的企業版。

二、關于Microsoft

  關于Microsoft,有無數的人要對這個名字敘說感覺,這個令人討厭的名字!不知道是喜歡還是憎惡,你是程序員,你的心思可能就要因Microsoft的存在而動,即使你用Linux,你可能也是因為Microsoft技術因素。多少年來,這個名字每天都出現在你、我、他的面前,因為你不得不面對Windows的存在,可是你憎恨這個名字嗎?你討厭這個名字嗎?我不知道是否已經對這個名字麻木了。

  1998年我個人訂了Microsoft MSDN Universal 版,我開始比較全面接觸這個公司的開發技術,你可以想象,1998年當你面對上百張技術光盤的時候,你就知道什么叫做"厚度",當我們有時說出"趕上"或 "達到"Microsoft某些產品的水平的時候,可能我們缺乏對這個公司"厚度"的真實了解。進入MSDN,我感覺Microsoft簡直不是一個"公司",而是(或者正在形成)一個"社會"。

  當時著名的技術網站http://www.codeguru.com全部的技術資料是可下載的(那個時候http://www.codeguru.com提供整個網站內容下載服務,大約3M左右),大名鼎鼎的

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

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

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

三、向Microsoft學習

  無論從什么角度評價Microsoft,我覺得Microsoft是值得我們學習的,如果說生活在這個時代有Microsoft存在是一場災難,你就應該痛恨這個家伙,但你首先要向這個家伙學習!我無意為Microsoft歌功頌德,我只是想說出十幾年我對Microsoft技術的感受。

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

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

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

四、為什么用MFC?

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

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

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

五、認識Application對象

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

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

m_pAppObj = new CComObject<CXXXAppObject>;

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

delete m_pAppObj;

  你可以將系統得關鍵屬性設置成CXXXAppObject的屬性,例如系統得標題、是否為多文檔等等。系統希望外部調用的功能可以實現為CXXXAppObject的方法,這一點取決于你的需要。系統需要外部擴展的功能,表現為CXXXAppObject的事件,關鍵是在恰當的位置觸發事件以及提供的事件參數。例如,你可以在CXXXApp::InitInstance()觸發應用程序開始的事件OnStartUp,Plugin捕獲事件后,可以進行特定的初始化(身份確認、初始信息查詢等等);你可以在CXXXApp::ExitInstance()觸發應用程序結束事件,Plugin捕獲事件后,處理用戶需要的系統退出工作。所有的設計取決于具體設計。

  如何加載Plugin,是一個有趣的問題,如果Plugin實現為一個COM范疇(Category),可以運用COM技術枚舉這個Category;可以將Plugin安裝到一個特定目錄,也可以通過注冊表。Plugin的實現可以用COM技術、也可以用.NET框架。適當的機會我會提供例子……

六、后記

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

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

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

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

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

CListCtrl(List Control)綁定ODBC數據庫的方法。(附加:CRecordset::Open()與CRecordset::OpenEx()區別之真實體驗~)

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

????CWinApp::InitInstance();???? // 此句為系統自動生成的;

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

????AfxEnableControlContainer();????
// 此句為系統自動生成的;

至此,與數據庫的連接基本上完成了,也正是因為這個db.Open("PrintTest;");才有了這篇文章。
3、向記錄集(CRecordset)填充數據,在這里我們必須要談到(數據庫和記錄集對象之間的)記錄字段交換 (RFX)。(大家可以在MSDN中查閱相關信息。)現在只將步驟做一個簡述:
???a.在“類視圖”中添加類,然后選擇“MFC ODBC 使用者”;
???b.在向導中,數據源按鈕后選擇“機器數據源”選擇我們設置的ODBC數據源,這里為PrintTest;確定;
???c.在彈出的對話框中選擇info表,確定;
???d.修改類名,文件名(如果有必要的話),這里改為CInfoRS,InfoRS.h,InfoRS.cpp
???e.注意下面的選擇是“動態集”,確定。(警告關閉)
這時候你可以在類向導中看到添加的新類,CInfoRS
4、在初始化對話框的時候進行數據的讀入。
值得注意的是:我們剛才定義的是全局的變量,但是定義的語句是在APP文件中寫入的,因此在Dlg文件中調用的時候我們仍然需要去聲明一下它是全局變量,也就是對Dlg來說,它是在外部已經定義過的變量。因此在Dlg.cpp的開頭我們補充extern CDatabase db;
在BOOL CPrintListCtrlDlg::OnInitDialog()中添加

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

????UpdateList(rs);


在這個應用程序中同樣要注意到,因為我們需要的是一張類似Access表的表格,而不是類似我的電腦的圖標形式的風格,因此我們需要在添加的ListControl的時候,將其屬性中的View設置為Report。

?UpdateList(rs);是我們自己添加的一個函數,再此我再介紹一下使用類向導添加函數的方法。
在類視圖中,右鍵,添加->添加函數,然后添加相關參數,比如返回值類型,參數類型等,記得添加參數的時候按“添加”將其添加到參數列表中。
下面列出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();
}
至此這個程序基本上就編寫完成了,但是使用Ctrl+F5調試的時候出現了錯誤。錯誤具體就不再描述,只告訴解決的方法。
1、一個是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”轉換為“LPCTSTR”
解決方法:在類視圖中定位到CInfoRS,在其變量(藍色方塊后),隨便點一個進入。按以下方法修改:
//將以下代碼:
????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


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


以下將本示例的代碼以及數據庫打包供大家學習下載!
http://m.shnenglu.com/Files/mymsdn/PrintListCtrl.rar

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

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

如何利用MFC建立的對話框應用程序中一鍵實現對CListCtrl(List Control控件)列表的表格打印?

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

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

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

用文檔序列化來保存打開文件[理論聯系實際]

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

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

僅列出標題
共9頁: 1 2 3 4 5 6 7 8 9 
特殊功能
 
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久香蕉国产线看观看网| 欧美另类高清视频在线| 麻豆国产精品va在线观看不卡| 亚洲精选在线| 亚洲国产合集| 91久久精品美女高潮| 亚洲电影激情视频网站| 亚洲欧洲另类国产综合| 亚洲精品久久嫩草网站秘色| 亚洲精品日韩激情在线电影| 在线一区视频| 欧美一区二区在线视频| 久久久水蜜桃av免费网站| 免费短视频成人日韩| 欧美激情第二页| 亚洲精品一区在线观看香蕉| 亚洲午夜激情网页| 亚洲欧美视频在线| 久久久噜噜噜久久中文字免| 欧美精品一区二区三区蜜桃 | 国产日韩一区| 国产一区二区福利| 亚洲国产精品小视频| 夜夜爽www精品| 欧美一区91| 美女网站在线免费欧美精品| 亚洲全部视频| 亚洲黄色成人| 一区二区免费看| 久久精品人人做人人爽| 欧美福利精品| 亚洲综合色在线| 老牛嫩草一区二区三区日本| 欧美日韩一区二区免费在线观看| 国产午夜久久| 99精品欧美一区二区三区综合在线| 亚洲欧美精品| 最新日韩中文字幕| 久久久91精品国产| 国产精品大片wwwwww| 亚洲成人资源网| 欧美一级久久久久久久大片| 亚洲国产精品热久久| 欧美一区二区黄| 国产精品久久久久永久免费观看| 一区二区三区自拍| 午夜久久久久| 999亚洲国产精| 欧美成人精品三级在线观看| 国产日韩精品视频一区| 夜夜嗨av一区二区三区四区| 欧美福利电影在线观看| 久久成人免费视频| 国产精品成人一区二区三区夜夜夜| 黄色亚洲精品| 久久福利精品| 亚洲一区二区三区中文字幕在线 | 亚洲国产精品传媒在线观看 | 欧美激情中文不卡| 久久九九99视频| 韩国视频理论视频久久| 久久精品国产亚洲aⅴ| 国产精品99久久久久久久久久久久| 欧美精品日韩一区| 9色porny自拍视频一区二区| 最新成人在线| 欧美日韩激情网| 中文一区二区| 在线亚洲精品| 国产精品自在在线| 久久国产精品久久久久久电车| 亚洲综合成人婷婷小说| 国产女主播一区二区| 欧美在线播放一区| 久久超碰97人人做人人爱| 国自产拍偷拍福利精品免费一| 久久久xxx| 久久久久久久网站| 亚洲二区在线视频| 亚洲国产欧美一区二区三区同亚洲 | 久久人人97超碰国产公开结果| 国产精品一区在线观看| 一区二区日韩伦理片| 亚洲国产高清在线| 久久久综合网站| 伊人春色精品| 美女成人午夜| 亚洲永久免费观看| 国内揄拍国内精品久久| 久久国产日本精品| 欧美影院成年免费版| 国产日韩av高清| 久久久久国内| 久久亚洲一区二区三区四区| **性色生活片久久毛片| 亚洲一卡二卡三卡四卡五卡| 西瓜成人精品人成网站| 国产一区二区三区免费不卡 | 性色av一区二区三区在线观看 | 噜噜噜噜噜久久久久久91| 亚洲第一黄网| 91久久中文| 国产精品区一区二区三区| 欧美一区二区三区四区高清| 欧美一级视频精品观看| 亚洲人成精品久久久久| 最新国产成人在线观看| 国产在线一区二区三区四区 | 欧美视频日韩| 久久久久国产一区二区三区| 欧美xxx成人| 久久久成人精品| 免费在线成人| 亚洲免费网站| 久久久久国色av免费观看性色| 亚洲福利视频在线| 日韩午夜激情电影| 欧美日韩第一区日日骚| 一本色道久久综合狠狠躁篇的优点| 亚洲视频在线免费观看| 一区二区在线观看av| 亚洲精品美女在线观看播放| 国产精品久久久久一区二区三区| 久久久久亚洲综合| 欧美日韩视频第一区| 国产精品sm| 欧美激情 亚洲a∨综合| 欧美丝袜一区二区三区| 性做久久久久久久久| 老司机一区二区三区| 亚洲欧美成人网| 欧美国产日韩一区二区三区| 精品91免费| 亚洲伊人观看| 夜夜爽www精品| 亚洲国产成人91精品| 国产精品99一区二区| 欧美华人在线视频| 最新成人av在线| 国产精品美女999| 99在线观看免费视频精品观看| 红桃视频国产精品| 亚洲四色影视在线观看| 亚洲国产精品一区| 久久精品一二三区| 午夜精品视频在线观看| 欧美日韩国产精品| 亚洲少妇自拍| 在线中文字幕一区| 欧美成人精品三级在线观看 | 亚洲人成人99网站| 亚洲欧洲在线免费| 欧美日韩精品高清| 亚洲精品1区| 亚洲一区自拍| 国产精品theporn| 亚洲欧美日韩在线综合| 亚洲一区二区三区免费观看 | 欧美伦理91i| 宅男噜噜噜66一区二区| a4yy欧美一区二区三区| 国产精品免费看久久久香蕉| 一本色道88久久加勒比精品| 午夜精品一区二区三区在线播放| 国产精品国产a| 亚洲综合色视频| 久久久亚洲精品一区二区三区| 国产亚洲欧美另类一区二区三区| 亚洲高清视频一区| 亚洲第一精品夜夜躁人人躁 | 亚洲欧美区自拍先锋| 国产精品裸体一区二区三区| 久久精品水蜜桃av综合天堂| 午夜久久久久久| 亚洲欧洲中文日韩久久av乱码| 久久久久久久久一区二区| 亚洲精品一区二区三区蜜桃久| 亚洲国产高潮在线观看| 欧美午夜电影网| 亚洲欧美日韩国产| 美女国内精品自产拍在线播放| 亚洲高清视频在线观看| 欧美国产日韩精品| 夜夜嗨av一区二区三区中文字幕| 久久久精品性| 亚洲欧洲在线播放| 国产精品高潮呻吟久久av黑人| 欧美一区二区三区视频免费播放| 嫩模写真一区二区三区三州| 国产精品免费区二区三区观看| 免费在线观看精品| 亚洲一区免费看| 久久亚洲精品视频| 日韩亚洲国产欧美| 国产精品日韩欧美大师| 亚洲视屏一区| 美女视频网站黄色亚洲| 亚洲毛片在线| 国产一区二区三区高清在线观看| 欧美11—12娇小xxxx|