摘要: [翻譯]關于“異步可插協議”(About Asynchronous Pluggable Protocols(APPs))
原文鏈接:http://msdn2.microsoft.com/en-us/library/aa767916(VS.85).aspx
閱讀全文
其實也不是真正的第一次,以前有用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
怎么樣,有意思吧。呵呵,也不知道自己會堅持使用這種方法多久。呵呵!
[目的]
記錄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 快速入門) |
| 點操作符通過它的左操作數取得有操作數。點操作符僅應用于類類型的對象:左操作數必須是類類型的對象,右操作數必須指定該類型的成員。 |
今天收到當當網寄過來的C++ Primer感覺興奮的同時又開始擔心。
記得前兩天寫下學習計劃這樣的文章,將未來設計地如此“完美”,但今天拿到書后又一陣壓力壓得我喘不過氣來,七百多頁的書握在手上著實又厚實了許多,但給我帶來的不是“踏實”的感覺,而是壓力。當年在校可以一天窩在圖書館看書,800多頁的書也就一頁一頁地啃下來了,前后也就兩個月多,而且效率還挺高的。但現在看這本大部頭就讓我覺得壓力,每天工作之余也挺累的,真不知道自己該如何堅持高效地完成這本書,其實在我看來,高效地看書比單純意義上的看書是更值得關注的。
下面就我對高效看書做一個簡要總結(針對計算機類書籍(非理論型)):
1、看書我習慣一次性看一大部分,比如說前后章節關聯比較緊密的,我習慣性會堅持看完,連貫性的東西拆開看,通常會降低效率。而且我不是那種合上書本前說明天再看就一定會去看的人,因此為了不然自己接下去看的時候已經是下個月的這種情況發生,我都會堅持將一個部分看完。
2、建議在效率高的時候看書,看書切忌為了數量而不追求質量,有的時候可能你很困或者注意力很難集中,那切忌不要看,因為看了等于沒看,而似乎又不愿意回頭再看,這樣將浪費那部分內容。
3、看書不提倡做小動作,之所以說不提倡是因為我將說“比如拿個筆晃來晃去”,因為這個習慣很多人都有,但是有的人受影響小,有的人則完全分心了。
4、看書一定要抓住重點多看幾眼,以前看書經常看后不知所云,后來發現需要多關注重點,雖然不是每個字都要記住,但是重點部分一定要多看幾眼,至于重點是什么,我想抱著求學的態度去認真看,重點不難找出。記得要多斟酌幾遍,有什么可以隨手記在邊上。
5、看書要勤做練習,這點和計算機特別有關聯,其實非常簡單的代碼,不去實踐一下也是不容易記住的,哪怕只是抄到電腦上,或許你就會有新的發現。而且有的時候斷點調試會有很多新的思路,對于自己在看書的時候有任何的疑問可以隨手記錄,比如你可以推算一段代碼的某一處某個變量的值是否和你所預期的一樣等等,其實這些都很容易就能夠掌握,關鍵在一個“勤”字。
6、看書要多加思考,如果有個學習伙伴那就更好,可以互相交流,有的時候很明顯的東西或許有有分歧的理解,這時候就是更需要證明的,證明自己往往要比自己看書更容易掌握,你不會告訴自己曾經某個時候你在某個地方對某個問題有深入的了解,但你一定會記得某個時候和伙伴為了一個細節爭論正確,最后不管戰況如何,你總是能記住那個被你求證過的結果,而不只是印象中的“似曾相識”。
7、看書一定要看好書,推薦到論壇上找找,總是有很多熱心人曾今推薦過,那些被廣泛支持的可以簡單地稱作“經典”,但切忌不要買了很多卻每本只看第一章。
以上是我個人對看書的一點小小的心得。
本來想寫一篇發泄壓抑的文章,但寫著寫著就成了表達看書心得了,既然寫了就發布上來,希望大家對我的看書心得給予評價。
希望未來一段時間我能堅持用自己總結的方法來按期完成任務。我現在在使用Gmail的日歷來管理我的時間,希望這對我有益,也希望大家能夠找個日歷來管理自己的時間(Gmail,Hotmail,Yahoo等都有挺不錯的日歷管理功能,大家根據各自的需要選擇吧)
有效管理時間,讓未來過得充實而又充滿豐收的喜悅。
半年前的軟件工程課程設計和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++的知識,后一本將繼續為我的設計創造新的動力。加油,不放棄,永不言敗!
今天懷著虞城的心來探索打印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的控件。(下載的代碼可能還多包括一個打印控件,但該控件的功能并未實現,只是一個預留的測試功能。大家自行練習的時候可以不添加該按鈕。)
如何利用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)
本文章并未實踐過,請高手分析一下思路是否可行,該套用是否可行以及潛在的難點。
摘要: 文檔與序列化
一、文檔的基本特征
文檔類文件是從CDocument繼承而來的。
...
閱讀全文