随笔-341  评论-2670  文章-0  trackbacks-0
C++
跟C++有关的一些东西
开始使用VS2012来开发GacUI了
posted @ 2012-08-30 05:29 陈梓瀚(vczh) 阅读(10766) | 评论 (25)  编辑
合并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) 阅读(6592) | 评论 (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) 阅读(6740) | 评论 (0)  编辑
C++反射实现方法设想(GacUI)
posted @ 2012-01-11 03:39 陈梓瀚(vczh) 阅读(8367) | 评论 (7)  编辑
回来了(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) 阅读(3298) | 评论 (11)  编辑
C++远程调用类操作支持Callback Interface      摘要: 今天展示一下如何使用这里描写的库实现一个简单的聊天工具。Callback Interface是昨晚才加的,但是还有一些features没实现,等做完了再做一个Demo,然后提供源代码。

使用这个东西可以开发一些C/S模式的程序,然后只需要将服务器和客户端看成同一个程序,将客户端认为是很多个线程就行了。服务器端提供一些类给客户端创建并使用,当这些服务类要求回调的时候,客户端只需要按照回调的接口实现回调,然后将指针提供给服务类就行了。剩下来的链接啊调度啊网络传输的问题就全部不用管了,非常方便。  阅读全文
posted @ 2009-07-17 18:20 陈梓瀚(vczh) 阅读(3524) | 评论 (10)  编辑
实现C++远程调用类的操作。      摘要: 这次展示如何将一个服务器端的C++类让客户端调用。使用早上刚刚开发完的工具,用户可以不用处理任何传输过程中的连接和编码解码等操作。这次实现一个四则运算的语法分析器,客户端发送表达式,服务器端传回语法树(继承树那个模型),客户端将语法树传回去,服务器端传回运算结果。  阅读全文
posted @ 2009-07-03 18:07 陈梓瀚(vczh) 阅读(3993) | 评论 (14)  编辑
C++基于类似反射机制的函数调用完成      摘要: 现在不仅可以阅读类的成员,也可以用函数名的字符串去调用函数并取得结果了。代码与这篇文章的实例类似,因此只贴出更改的部分以及程序截图。  阅读全文
posted @ 2009-06-29 20:47 陈梓瀚(vczh) 阅读(4602) | 评论 (0)  编辑
残废版HTTP Server之小试牛刀      摘要: 为了给C++的反射做Demo,不得不研究一下HTTP的协议。后来发现Windows自带了API可以用,于是就写了个小东西。程序打开之后,如果检测到【http://localhost:8080/vczh/FILENAME】这样子的请求,就将一个目录下面的东西读出来,然后返回。于是就可以用IE来运行某个地方的网页了。代码如下:  阅读全文
posted @ 2009-06-29 05:19 陈梓瀚(vczh) 阅读(3773) | 评论 (4)  编辑
C++基于类似反射机制的XML序列化和反序列化完成      摘要: 跟上一篇文章一样,一样的数据结构,但是添加了对数组、列表和映射的更多的支持。首先是代码,然后是序列化后的XML文件。  阅读全文
posted @ 2009-06-28 20:12 陈梓瀚(vczh) 阅读(6330) | 评论 (10)  编辑
重写了C++的类似反射的工具      摘要: 所谓的反射当然不是自动化的,而是需要自己打标记的。下面会展示两份文件,告诉大家我这个做了一半的反射是怎么工作的。写这个东西的主要目的是,将来可以实现序列化,譬如说序列化到流,或者序列化到XML文件,或者做其他的事情等等(譬如说使用类名创建对象并进行修改)。  阅读全文
posted @ 2009-06-25 06:48 陈梓瀚(vczh) 阅读(3481) | 评论 (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) 阅读(2961) | 评论 (4)  编辑
Combinator Parser修改错误处理方法      摘要: 在实验了CMinus语法分析器的错误处理之后发现一个问题,Combinator Parser返回的错误是最上级的错误,而不是最底层的错误。因此修改了语法分析器的一部分代码:  阅读全文
posted @ 2009-05-04 02:35 陈梓瀚(vczh) 阅读(1770) | 评论 (1)  编辑
搞定模板元编程(meta programming)      摘要: 今天闲得无聊,早上起来习惯性瞟一瞟boost,突然看中了它的MPL库,所以自己实现了一个子集消磨时间。

已经实现的功能有:整数运算、闭包、列表处理等。我用了自己的unit test框架,通过写一个函数输出一个属于自己的MPL类型的字符串(譬如List,List,Empty>>产生"[0 , 1]"),然后用自己写的字符串比较,可以发现库里面是否有错。

一下有两份代码,第一份是使用,第二份是自己的MPL的源代码:  阅读全文
posted @ 2009-04-08 05:17 陈梓瀚(vczh) 阅读(3633) | 评论 (13)  编辑
实现了Huffman压缩解压算法      摘要: 今天终于在流系统里面添加了Huffman的压缩解压算法,现在只需要将一个LZ77流加到Huffman流上面,就能同时使用两种压缩算法进行压缩了。我的Huffman算法使用了Canonical Huffman编码方法进行Huffman树的生成。  阅读全文
posted @ 2009-01-10 09:16 陈梓瀚(vczh) 阅读(3450) | 评论 (0)  编辑
修改后的LZ77压缩解压源码      摘要: 这份代码跟上一次相比,修正了以下部分:

1、可修改的Window Size。压缩流会把Window Size写进去,解压流能够自动获取。
2、发现冗余的地方,每一个标记的压缩块节省了一位。
3、如果用户一次性写入的字节不够多则会缓存起来,上一版本则是直接压缩完。这样会丢失某些原本可以压缩的数据,因此修正。  阅读全文
posted @ 2009-01-06 23:35 陈梓瀚(vczh) 阅读(2841) | 评论 (6)  编辑
LZ77压缩效果测试      摘要: 今天将我的VL_LZ77Stream修改成了可以设置窗口大小的压缩流。我用了一些文件进行压缩和对比。  阅读全文
posted @ 2009-01-06 08:36 陈梓瀚(vczh) 阅读(2202) | 评论 (1)  编辑
实现了一个128长度窗口大小的LZ77压缩解压算法      摘要: 这个压缩流是Vczh Library++ 2.0庞大的流与控制器系统的其中一个部分。我准备将其改造成可调大小的,并且打算添加LZW与Huffman压缩解压算法。以下是用C++实现的代码。  阅读全文
posted @ 2009-01-05 09:47 陈梓瀚(vczh) 阅读(2598) | 评论 (5)  编辑
分解复杂的命令行参数      摘要: 当我们的程序需要运行在命令行环境下的时候,分解复杂的命令行参数往往成为一件不难但又麻烦的事情。我们经常发现.net的开发工具的命令行格式都是"/parameterA:valueA /parameterB:valueB"。如果我们希望使用这种格式的命令行参数的话,如何分析就成为我们需要解决的一个问题。  阅读全文
posted @ 2008-12-24 01:13 陈梓瀚(vczh) 阅读(2086) | 评论 (2)  编辑
Vczh Serialization Demo :在网络上传递复杂对象      摘要: 今天将Serialization进行了重构,让其支持容器。于是使用以前的基础设施就能完成这个Demo了。代码如下:  阅读全文
posted @ 2008-11-22 02:26 陈梓瀚(vczh) 阅读(2038) | 评论 (6)  编辑
我做的一个C++用的Serialization库(含部分源码)      摘要: 众所周知,boost里面有一个Serialization。不过我这个跟boost的有本质上的差别。boost的Serialization是通过重载操作符将一个对象与一个流进行读写,而我则通过记录类的成员变量来自动产生相应的读写动作。使用方便。  阅读全文
posted @ 2008-11-21 09:09 陈梓瀚(vczh) 阅读(2645) | 评论 (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) 阅读(1981) | 评论 (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) 阅读(1500) | 评论 (1)  编辑
TrackBar迅速做完      摘要: Track Bar很是人性化,不会跟自己之前的经验冲突。Track Bar下面那些杠杠原来是自己插入的,还能改,还真是想干啥就能干啥……  阅读全文
posted @ 2008-08-15 08:28 陈梓瀚(vczh) 阅读(1713) | 评论 (1)  编辑
Scroll Bar完成      摘要: Win32 API为了让控件更为有用真是煞费苦心,不仅Tab没有提供控件可见控制,连Scroll Bar点击的时候竟然是不修改Position的,要我在每一个消息里用SBM_SETSCROLLINFO来设置当前的位置。而且当前的位置的获得还不是一致的,根据消息的不同而不同。真是故意为难人啊。  阅读全文
posted @ 2008-08-15 06:26 陈梓瀚(vczh) 阅读(1371) | 评论 (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) 阅读(1538) | 评论 (2)  编辑
TabControl封装完成      摘要: 原来API提供的TabControl只是改改样式而已,客户区连TabPage标签也算在了里面,点击不同的TabPage也不会自动切换子控件的可见属性。这些都要封装啊囧……

在这个设计里,虽然TabPage是一个普通的类,但是每一个TabPage都会自动附带一个Static Control,并在适当的时机修改大小以及修改可见属性。子控件实际上需要放在TabPage的Static Control里,不然的话其实可以连TabPage标签都挡掉。  阅读全文
posted @ 2008-08-13 06:33 陈梓瀚(vczh) 阅读(1679) | 评论 (2)  编辑
TreeView完成      摘要: 囧,实在是囧啊。比起ListView,TreeView还真是简单了无穷多倍,一个晚上就搞定了。贴贴代码和图。  阅读全文
posted @ 2008-08-11 05:05 陈梓瀚(vczh) 阅读(2158) | 评论 (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) 阅读(6473) | 评论 (27)  编辑
使用ComboBox在输入路径的时候自动显示文件名      摘要: 今天封装好了ComboBox,于是做了个Demo。这个Demo只有一个窗口,上面放着一个ComboBox。如果往里面打文件名的话,会把当前路径下的被筛选过的文件名填充到ComboBox,并自动打开下拉列表。  阅读全文
posted @ 2008-08-04 07:20 陈梓瀚(vczh) 阅读(2083) | 评论 (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) 阅读(1897) | 评论 (8)  编辑
UI库添加Edit、Static和Placement      摘要: 为了缓解疲劳,我网络和UI同时做。封装UI真是麻烦啊,一大堆习惯的东西原来是没有的,什么tab转移焦点,什么控件对齐,都要自己做。后来就囧了,干脆实现一个Placement来自动调整控件的位置。  阅读全文
posted @ 2008-08-03 04:54 陈梓瀚(vczh) 阅读(1836) | 评论 (8)  编辑
Vczh Messenger
posted @ 2008-08-02 06:47 陈梓瀚(vczh) 阅读(1761) | 评论 (4)  编辑
Vista的新控件      摘要: Vista提供的Common Control Library 6.0的BUTTON类中提供了两种新的按钮:Command Link和Split Button。只需要在CreateWindow里面指定BS_COMMANDLINK与BS_SPLITBUTTON就可以获得这两种新的控件了。  阅读全文
posted @ 2008-07-22 06:41 陈梓瀚(vczh) 阅读(1860) | 评论 (10)  编辑
使用XPath轻松获得VC9.0工程文件包含的所有代码文件      摘要: 玩了几天空之轨迹 FC,终于快结束了。距离最后一门考试还有3天,于是把整个XPath的代码写完了。于是试用一下。

现在展示一下我那个XPath的使用方法:
1 VL_List Result;
2 VL_XPath XPath(L"//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) 阅读(2305) | 评论 (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) 阅读(2394) | 评论 (2)  编辑
标准XPath语法整理
posted @ 2008-06-20 01:44 陈梓瀚(vczh) 阅读(4833) | 评论 (1)  编辑
做了一个XML解释器      摘要: 为了纪念自己为了明天的XML考试复习了半天,特地根据MSDN描述的标准做了一个XML的解释器。接口类似DOM和SAX的混合体。
目前什么都不支持,不过以后打算做完DTD和XPath。XSD和XSL就先算了。反正是写着玩的。把代码贴出来先。这个代码使用了自己开发的一套C++基础库。
  阅读全文
posted @ 2008-06-19 05:28 陈梓瀚(vczh) 阅读(3077) | 评论 (8)  编辑
做个投票,大家支持
posted @ 2008-05-14 19:14 陈梓瀚(vczh) 阅读(1698) | 评论 (10)  编辑
笔试
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) 阅读(14893) | 评论 (21)  编辑
寻路算法:模仿Tower Defense Flash做了一个小游戏      摘要: 第一次用C#写游戏。在C#上写算法果然是一个挑战,时间复杂度太大的话造成的后果比C++明显好多,于是总是尽量把东西做成O(n)或者O(nlogn)。这次就在上面实现了一个寻路算法。

这个寻路算法是这样的:在16×16的方格上有一些终点,东西在格子上只能上下左右行动。每一个格子需要记录到其中一个终点的最近的路的第一个方向(就像三层循环的寻路算法一样,最后给出矩阵的那个)。  阅读全文
posted @ 2008-04-30 05:29 陈梓瀚(vczh) 阅读(4323) | 评论 (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) 阅读(2520) | 评论 (6)  编辑