摘要: [翻譯]關(guān)于“異步可插協(xié)議”(About Asynchronous Pluggable Protocols(APPs))
原文鏈接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx
閱讀全文
其實(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)持使用這種方法多久。呵呵!
[目的]
記錄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ù)必須指定該類型的成員。 |
今天收到當(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í)而又充滿豐收的喜悅。
半年前的軟件工程課程設(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>
今天懷著虞城的心來探索打印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í)候可以不添加該按鈕。)
如何利用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)。
摘要: 文檔與序列化
一、文檔的基本特征
文檔類文件是從CDocument繼承而來的。
...
閱讀全文