C++
跟C++有關的一些東西
合并Visual Studio本地C++XML注釋文檔和PDB的符號內容
摘要: 終于到了激動人心的時刻了。今天的博客內容將永遠消除Visual Studio的本地C++XML注釋編譯出來的XML文檔沒有辦法生成可讀文檔的根本原因。
首先介紹一下C++的XML注釋。在啟用注釋之前,我們必須先去工程屬性里面,把[C/C++ -> Output Files -> Generate Xml Documentation Files]設置成Yes。這樣我們就可以在C++的類啊函數上面寫XML注釋,然后被編譯成一份帶有符號鏈接的XML注釋集合。這里先給一個GacUI的XML注釋的例子:
閱讀全文
posted @
2012-03-09 17:04 陳梓瀚(vczh) 閱讀(6781) |
評論 (7) 編輯
使用VS API開發一個PDB Dumper并且可以在沒裝VS2010的計算機上運行
摘要: GacUI到了撰寫文檔的時候了。雖然GacUI本身的功能還沒有全部完成,但是發布一個alpha版還是可以的。因此GacUI需要一份文檔。自從.net語言支持XML注釋生成文檔之后,Visual Studio的本地C++也支持使用XML注釋了。只要打開了[工程屬性 -> C/C++ -> Output Files -> Generate XML Documentation Files]之后,Visual Studio會在編譯本地C++工程之后,將所有的XML注釋收集起來,放在和可執行文件同一個目錄下的
里面。然后我就嘗試bing了一下有沒有從C++的XML文檔生成可讀文檔的工具,結果發現只有.net才支持。
后來我稍微研究了一下(詳細內容將會在下一篇博客透露),發現之所以沒人寫這個工具,是因為只有.net的可執行文件才包含足夠多的元數據,而且這些元數據是必須的,否則無法生成一個完整的文檔。舉個例子,雖然包含了xml注釋和該注釋所在的符號,但是卻沒有包含該符號的結構信息。結果你試圖生成一個函 閱讀全文
posted @
2012-03-09 14:43 陳梓瀚(vczh) 閱讀(7047) |
評論 (0) 編輯
回來了(VL++3.0計劃)
摘要: 之前因為非常忙,加上無聊開發什么類似WCF和WPF的東西,最近終于找到了新的目標了,于是之前那些就不做了。隔了這么久沒法文章主要是因為最近沒寫出什么完整的東西。國慶玩了9天,之前在計劃VL++3.0。
VL++3.0被定位為一個為了數據處理而開發的C++庫。這個庫不的特點在于“其他語言的味道很濃”。C++的庫用起來不爽主要是因為老是要我按下劃線,而且大量應用非OOP特性導致IDE的自動補全無法發揮作用。所以為了彌補這個缺陷我做了一個很不一樣的東西,也就是VL++了。經過了三年多的開發,1.0和2.0已經相繼出爐,每一次打翻新都解決了一些前一個版本解決不了的問題。
閱讀全文
posted @
2009-10-09 07:17 陳梓瀚(vczh) 閱讀(3447) |
評論 (11) 編輯
C++遠程調用類操作支持Callback Interface
摘要: 今天展示一下如何使用這里描寫的庫實現一個簡單的聊天工具。Callback Interface是昨晚才加的,但是還有一些features沒實現,等做完了再做一個Demo,然后提供源代碼。
使用這個東西可以開發一些C/S模式的程序,然后只需要將服務器和客戶端看成同一個程序,將客戶端認為是很多個線程就行了。服務器端提供一些類給客戶端創建并使用,當這些服務類要求回調的時候,客戶端只需要按照回調的接口實現回調,然后將指針提供給服務類就行了。剩下來的鏈接啊調度啊網絡傳輸的問題就全部不用管了,非常方便。
閱讀全文
posted @
2009-07-17 18:20 陳梓瀚(vczh) 閱讀(3662) |
評論 (10) 編輯
實現C++遠程調用類的操作。
摘要: 這次展示如何將一個服務器端的C++類讓客戶端調用。使用早上剛剛開發完的工具,用戶可以不用處理任何傳輸過程中的連接和編碼解碼等操作。這次實現一個四則運算的語法分析器,客戶端發送表達式,服務器端傳回語法樹(繼承樹那個模型),客戶端將語法樹傳回去,服務器端傳回運算結果。
閱讀全文
posted @
2009-07-03 18:07 陳梓瀚(vczh) 閱讀(4129) |
評論 (14) 編輯
C++基于類似反射機制的函數調用完成
摘要: 現在不僅可以閱讀類的成員,也可以用函數名的字符串去調用函數并取得結果了。代碼與這篇文章的實例類似,因此只貼出更改的部分以及程序截圖。
閱讀全文
posted @
2009-06-29 20:47 陳梓瀚(vczh) 閱讀(4791) |
評論 (0) 編輯
殘廢版HTTP Server之小試牛刀
摘要: 為了給C++的反射做Demo,不得不研究一下HTTP的協議。后來發現Windows自帶了API可以用,于是就寫了個小東西。程序打開之后,如果檢測到【http://localhost:8080/vczh/FILENAME】這樣子的請求,就將一個目錄下面的東西讀出來,然后返回。于是就可以用IE來運行某個地方的網頁了。代碼如下:
閱讀全文
posted @
2009-06-29 05:19 陳梓瀚(vczh) 閱讀(3901) |
評論 (4) 編輯
C++基于類似反射機制的XML序列化和反序列化完成
摘要: 跟上一篇文章一樣,一樣的數據結構,但是添加了對數組、列表和映射的更多的支持。首先是代碼,然后是序列化后的XML文件。
閱讀全文
posted @
2009-06-28 20:12 陳梓瀚(vczh) 閱讀(6512) |
評論 (10) 編輯
重寫了C++的類似反射的工具
摘要: 所謂的反射當然不是自動化的,而是需要自己打標記的。下面會展示兩份文件,告訴大家我這個做了一半的反射是怎么工作的。寫這個東西的主要目的是,將來可以實現序列化,譬如說序列化到流,或者序列化到XML文件,或者做其他的事情等等(譬如說使用類名創建對象并進行修改)。
閱讀全文
posted @
2009-06-25 06:48 陳梓瀚(vczh) 閱讀(3583) |
評論 (4) 編輯
使用COM實現控件內容的Drag and Drop
摘要: 查了MSDN,發現Windows支持Drag and Drop的方法是四個COM:IEnumFORMATETC、IDataObject、IDropSource和IDropTarget。為了讓自己做的一個代碼編輯文本框里面的代碼可以被拖出去拖進來,無奈之下只好實現了這四個東西。
實現了之后,程序剛開始需要調用OldInitialize(NULL);,結束的時候調用OnUninitialize();,控件創建的時候調用RegisterDragDrop,控件結束的時候調用RevokeDragDrop。然后就可以通過這些COM來做Drag and Drop了。下面是接口的實現:
閱讀全文
posted @
2009-05-29 21:17 陳梓瀚(vczh) 閱讀(3047) |
評論 (4) 編輯
Combinator Parser修改錯誤處理方法
摘要: 在實驗了CMinus語法分析器的錯誤處理之后發現一個問題,Combinator Parser返回的錯誤是最上級的錯誤,而不是最底層的錯誤。因此修改了語法分析器的一部分代碼:
閱讀全文
posted @
2009-05-04 02:35 陳梓瀚(vczh) 閱讀(1838) |
評論 (1) 編輯
搞定模板元編程(meta programming)
摘要: 今天閑得無聊,早上起來習慣性瞟一瞟boost,突然看中了它的MPL庫,所以自己實現了一個子集消磨時間。
已經實現的功能有:整數運算、閉包、列表處理等。我用了自己的unit test框架,通過寫一個函數輸出一個屬于自己的MPL類型的字符串(譬如List
,List,Empty>>產生"[0 , 1]"),然后用自己寫的字符串比較,可以發現庫里面是否有錯。
一下有兩份代碼,第一份是使用,第二份是自己的MPL的源代碼: 閱讀全文
posted @
2009-04-08 05:17 陳梓瀚(vczh) 閱讀(3736) |
評論 (13) 編輯
實現了Huffman壓縮解壓算法
摘要: 今天終于在流系統里面添加了Huffman的壓縮解壓算法,現在只需要將一個LZ77流加到Huffman流上面,就能同時使用兩種壓縮算法進行壓縮了。我的Huffman算法使用了Canonical Huffman編碼方法進行Huffman樹的生成。
閱讀全文
posted @
2009-01-10 09:16 陳梓瀚(vczh) 閱讀(3517) |
評論 (0) 編輯
修改后的LZ77壓縮解壓源碼
摘要: 這份代碼跟上一次相比,修正了以下部分:
1、可修改的Window Size。壓縮流會把Window Size寫進去,解壓流能夠自動獲取。
2、發現冗余的地方,每一個標記的壓縮塊節省了一位。
3、如果用戶一次性寫入的字節不夠多則會緩存起來,上一版本則是直接壓縮完。這樣會丟失某些原本可以壓縮的數據,因此修正。
閱讀全文
posted @
2009-01-06 23:35 陳梓瀚(vczh) 閱讀(3036) |
評論 (6) 編輯
LZ77壓縮效果測試
摘要: 今天將我的VL_LZ77Stream修改成了可以設置窗口大小的壓縮流。我用了一些文件進行壓縮和對比。
閱讀全文
posted @
2009-01-06 08:36 陳梓瀚(vczh) 閱讀(2281) |
評論 (1) 編輯
實現了一個128長度窗口大小的LZ77壓縮解壓算法
摘要: 這個壓縮流是Vczh Library++ 2.0龐大的流與控制器系統的其中一個部分。我準備將其改造成可調大小的,并且打算添加LZW與Huffman壓縮解壓算法。以下是用C++實現的代碼。
閱讀全文
posted @
2009-01-05 09:47 陳梓瀚(vczh) 閱讀(2749) |
評論 (5) 編輯
分解復雜的命令行參數
摘要: 當我們的程序需要運行在命令行環境下的時候,分解復雜的命令行參數往往成為一件不難但又麻煩的事情。我們經常發現.net的開發工具的命令行格式都是"/parameterA:valueA /parameterB:valueB"。如果我們希望使用這種格式的命令行參數的話,如何分析就成為我們需要解決的一個問題。
閱讀全文
posted @
2008-12-24 01:13 陳梓瀚(vczh) 閱讀(2192) |
評論 (2) 編輯
Vczh Serialization Demo :在網絡上傳遞復雜對象
摘要: 今天將Serialization進行了重構,讓其支持容器。于是使用以前的基礎設施就能完成這個Demo了。代碼如下:
閱讀全文
posted @
2008-11-22 02:26 陳梓瀚(vczh) 閱讀(2149) |
評論 (6) 編輯
我做的一個C++用的Serialization庫(含部分源碼)
摘要: 眾所周知,boost里面有一個Serialization。不過我這個跟boost的有本質上的差別。boost的Serialization是通過重載操作符將一個對象與一個流進行讀寫,而我則通過記錄類的成員變量來自動產生相應的讀寫動作。使用方便。
閱讀全文
posted @
2008-11-21 09:09 陳梓瀚(vczh) 閱讀(2840) |
評論 (9) 編輯
Vczh GUI Framework Preview完成!Preview Demo開始制作!
摘要: 為了展示Vczh Library++2.0中GUI Framework的強大威力,我制作了一個Regular Expression Debugger。這個軟件可以用來調試正則表達式,主要用于檢查正則表達式語法、觀察表達式的語法樹以及各種狀態機、還有匹配測試等。這個Demo已經接近完成。GUI Framework和Demo的代碼將在Demo徹底完成的時候放上來。下面貼圖和創建界面的代碼:
閱讀全文
posted @
2008-08-23 23:18 陳梓瀚(vczh) 閱讀(2101) |
評論 (6) 編輯
Status Bar完成
摘要: Status Bar所提供的消息相當的詭異。Status Bar里面的Items的數量以及寬度要一次性設置好,每次修改的時候都要推翻重建一次,只不過里面的Text倒是可以單獨改掉。在XP底下有效的raise border似乎在Vista就沒有了。看來Vista已經從偽3D徹底轉向了2D了。
Status Bar在CreateWindowEx的時候會自動將自己放在窗口的最底下,每一次修改Status Bar的尺寸的時候,它又會自動把自己放在窗口的最底下。當然,你可以讓他出現在最上面。雖然如此,但是我封裝的時候還是想自由地修改尺寸和位置,當且僅當我想讓他出現在窗口最下面的時候他才出現在窗口最下面,于是我只好截獲Status Bar的WM_SIZE消息并扔掉了。
當初為每一個控件都自動Subclass掉的想法還真是正確啊……
閱讀全文
posted @
2008-08-15 23:34 陳梓瀚(vczh) 閱讀(1551) |
評論 (1) 編輯
TrackBar迅速做完
摘要: Track Bar很是人性化,不會跟自己之前的經驗沖突。Track Bar下面那些杠杠原來是自己插入的,還能改,還真是想干啥就能干啥……
閱讀全文
posted @
2008-08-15 08:28 陳梓瀚(vczh) 閱讀(1772) |
評論 (1) 編輯
Scroll Bar完成
摘要: Win32 API為了讓控件更為有用真是煞費苦心,不僅Tab沒有提供控件可見控制,連Scroll Bar點擊的時候竟然是不修改Position的,要我在每一個消息里用SBM_SETSCROLLINFO來設置當前的位置。而且當前的位置的獲得還不是一致的,根據消息的不同而不同。真是故意為難人啊。
閱讀全文
posted @
2008-08-15 06:26 陳梓瀚(vczh) 閱讀(1432) |
評論 (1) 編輯
Vczh GUI Framework取材決定
摘要: 今天不小心看到了http://www.antlr.org/works/index.html,我一直認為ANTLR是LR(k)分析器,后來我錯了,原來只是LL(k)。我以前寫的一個Vczh Syngram是LR(k)的畸形,今天看了居然連LL(k)都能有GUI,我不做一個豈不是對不起自己?
閱讀全文
posted @
2008-08-14 05:21 陳梓瀚(vczh) 閱讀(1626) |
評論 (2) 編輯
TabControl封裝完成
摘要: 原來API提供的TabControl只是改改樣式而已,客戶區連TabPage標簽也算在了里面,點擊不同的TabPage也不會自動切換子控件的可見屬性。這些都要封裝啊囧……
在這個設計里,雖然TabPage是一個普通的類,但是每一個TabPage都會自動附帶一個Static Control,并在適當的時機修改大小以及修改可見屬性。子控件實際上需要放在TabPage的Static Control里,不然的話其實可以連TabPage標簽都擋掉。
閱讀全文
posted @
2008-08-13 06:33 陳梓瀚(vczh) 閱讀(1717) |
評論 (2) 編輯
TreeView完成
摘要: 囧,實在是囧啊。比起ListView,TreeView還真是簡單了無窮多倍,一個晚上就搞定了。貼貼代碼和圖。
閱讀全文
posted @
2008-08-11 05:05 陳梓瀚(vczh) 閱讀(2301) |
評論 (6) 編輯
ListView封裝完了,放代碼
摘要: ListView實在是超級無敵復雜地難封裝啊,Vista下的ListView簡直是萬能的,以至于我萌生了將grid和tree-grid都用ListView來實現的想法。當然這只是想一想,暫時不想做。這個ListView花了1700行代碼封裝完成,共有4個類,分別是item、column、group和listview,listview自己的事件16個。
代碼和圖片內詳
閱讀全文
posted @
2008-08-09 02:36 陳梓瀚(vczh) 閱讀(6694) |
評論 (27) 編輯
使用ComboBox在輸入路徑的時候自動顯示文件名
摘要: 今天封裝好了ComboBox,于是做了個Demo。這個Demo只有一個窗口,上面放著一個ComboBox。如果往里面打文件名的話,會把當前路徑下的被篩選過的文件名填充到ComboBox,并自動打開下拉列表。
閱讀全文
posted @
2008-08-04 07:20 陳梓瀚(vczh) 閱讀(2232) |
評論 (3) 編輯
新增ListBox
摘要: 封裝Common Control Library 6.0的API越來越順手了。雖說要消滅BEGIN_MESSAGE_MAP之類的代碼,不過寫起來也不容易。BEGIN_MESSAGE_MAP不能動態替換,所以我換成了類似C#的Event和Delegate那樣子的東西。如果不需要動態替換的話,實際上并沒有什么區別,唯一的區別就在于你可以利用VC++的Intellisense去查看自己想要的事件,而不是將什么WM_LBUTTONDOWN之類的消息記住了。
閱讀全文
posted @
2008-08-03 08:48 陳梓瀚(vczh) 閱讀(1977) |
評論 (8) 編輯
UI庫添加Edit、Static和Placement
摘要: 為了緩解疲勞,我網絡和UI同時做。封裝UI真是麻煩啊,一大堆習慣的東西原來是沒有的,什么tab轉移焦點,什么控件對齊,都要自己做。后來就囧了,干脆實現一個Placement來自動調整控件的位置。
閱讀全文
posted @
2008-08-03 04:54 陳梓瀚(vczh) 閱讀(1929) |
評論 (8) 編輯
Vista的新控件
摘要: Vista提供的Common Control Library 6.0的BUTTON類中提供了兩種新的按鈕:Command Link和Split Button。只需要在CreateWindow里面指定BS_COMMANDLINK與BS_SPLITBUTTON就可以獲得這兩種新的控件了。
閱讀全文
posted @
2008-07-22 06:41 陳梓瀚(vczh) 閱讀(1944) |
評論 (10) 編輯
使用XPath輕松獲得VC9.0工程文件包含的所有代碼文件
摘要: 玩了幾天空之軌跡 FC,終于快結束了。距離最后一門考試還有3天,于是把整個XPath的代碼寫完了。于是試用一下。
現在展示一下我那個XPath的使用方法:
1 VL_List
Result;
2 VL_XPath XPath(L"http://Files//File[contains(@RelativePath,\".cpp\") or contains(@RelativePath,\".h\")]");
3 XPath.Query(Doc.GetRootElement(),Result); 第一行聲明一個XML節點列表,第二行構造一個XPath,第三行將XPath作用在一個XML文檔的根節點上。這個XPath用于把VC++9.0的工程文件中包含的所有.h文件和.cpp文件提取出來。雖然Files里面包含若干Filter,每一個Filter包含一些Filter和File,不過輸出結果Output.xml把所有的滿足要求的File節點都找了出來。
閱讀全文
posted @
2008-06-27 20:55 陳梓瀚(vczh) 閱讀(2415) |
評論 (2) 編輯
XPath語法分析器完成!
摘要: 花了2個小時終于把XPath的數據結構和語法分析做完了。這個XPath的語法完全按照MSDN所說的做,除了減少了2個跟DTD相關的函數和11個Microsoft擴展的"ms:"開頭的函數以外,剩下的功能將一概支持。
代碼寫完了之后,我打開MSDN找里面的幾十條XPath Example進行測試,發現了一些Bug,然后修正。現在MSDN所列舉的所有例子都通過了,接下來只有自己寫Example進行測試了。因為MSDN的例子并沒有覆蓋所有等價類。
下面是運行結果和測試程序的代碼:
閱讀全文
posted @
2008-06-21 00:34 陳梓瀚(vczh) 閱讀(2458) |
評論 (2) 編輯
做了一個XML解釋器
摘要: 為了紀念自己為了明天的XML考試復習了半天,特地根據MSDN描述的標準做了一個XML的解釋器。接口類似DOM和SAX的混合體。
目前什么都不支持,不過以后打算做完DTD和XPath。XSD和XSL就先算了。反正是寫著玩的。把代碼貼出來先。這個代碼使用了自己開發的一套C++基礎庫。
閱讀全文
posted @
2008-06-19 05:28 陳梓瀚(vczh) 閱讀(3163) |
評論 (8) 編輯
筆試
posted @
2008-05-12 10:59 陳梓瀚(vczh)|
編輯
正則表達式——一點小插曲
摘要: 有個同學近來一直在做一個魔獸世界戰況分析(名字好像叫DeusCraft),說是很火。只是用C#覺得不是很爽,想移植到C++上面來。但是那個東西在分析的時候用了好多正則表達式,于是只好找了些正則表達式引擎來測。
測試的文件一共有27萬多行,首先通過一個檢查時間的正則表達式。如果成功,則在接下來的20幾條正則表達式中驗證字符串命中哪一條,然后開始做剩余的工作。原先在C#上花了12秒分析,后來換了boost的正則表達式花費40秒,然后從MSR上找了一個號稱比boost快4倍的正則表達式引擎,結果還是40秒(都是微軟的,咋差距這么大……)。于是同學用他自己做的正則表達式引擎花了23秒(此數據不太記得),我用我以前那個東西花費108秒(-_-|||)。
于是我們這幾天就在優化正則表達式引擎,到了今天同學那個花費13秒,我那個12秒。Visual Studio 2008 Team System上有一個Performance Wizard,用于在程序執行的過程中統計各個函數所占用的時間,可以方便定位,看出效率瓶頸,非常好用。
閱讀全文
posted @
2008-05-07 05:21 陳梓瀚(vczh) 閱讀(15453) |
評論 (21) 編輯
尋路算法:模仿Tower Defense Flash做了一個小游戲
摘要: 第一次用C#寫游戲。在C#上寫算法果然是一個挑戰,時間復雜度太大的話造成的后果比C++明顯好多,于是總是盡量把東西做成O(n)或者O(nlogn)。這次就在上面實現了一個尋路算法。
這個尋路算法是這樣的:在16×16的方格上有一些終點,東西在格子上只能上下左右行動。每一個格子需要記錄到其中一個終點的最近的路的第一個方向(就像三層循環的尋路算法一樣,最后給出矩陣的那個)。
閱讀全文
posted @
2008-04-30 05:29 陳梓瀚(vczh) 閱讀(4454) |
評論 (5) 編輯
今天發現自己的array類太慢
摘要: Lazy Compile使用Syngram動態創建語法分析器的代碼實在是太慢了,debug竟然需要8秒鐘來處理91條比較長的文法。于是我打開了Visual Studio 2008的Performance Wizard查看運行時消耗的資源,結果發現竟然都消耗在自己那個array類的operator[]里面了。那一段代碼是用來檢查文法的左遞歸引用關系是否出現環的。結果就把用到的四個array全部換成bool*了,當時只是為了創建二維數組方便使用了array類。
過后,debug的時間立刻降為2秒鐘不到,于是我又打開Performance Wizard看了一次,這次消耗的瓶頸終于轉移到一個合理的地方了。
結果:array竟然比指針慢了無窮多倍,得找個時候重新寫一次。不過這段代碼好象是去年寫的,也沒經過什么性能測試,也難怪發現不了問題。在此帖上代碼,等Lazy Script寫完了重新審查一下自己的那套模板庫(NTL,Non-standard Template Library,娃哈哈)。
閱讀全文
posted @
2008-04-27 19:53 陳梓瀚(vczh) 閱讀(2630) |
評論 (6) 編輯