摘要: Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。
Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。
阅读全文
posted @
2012-10-15 20:16 Richard Wei 阅读(3098) |
评论 (0) |
编辑 收藏
摘要: 经过上面的比较, 我们可以得出一些结论:
消息方式的强项是耦合性和扩展性,以及监控的方便性,个人感觉比较适合于Server端的规模应用。
接口方式的强项是性能高效以及开发的方便性, 比较适用于同一进程内客户端的小规模应用。
但是大部分时候, 对于架构师或是公司领导,他们会更关注可耦合性和可扩展性,所以他们会倾向于选择消息方式,尽管有时可能不是那么适用。
阅读全文
posted @
2012-10-12 22:50 Richard Wei 阅读(4584) |
评论 (5) |
编辑 收藏
摘要: operator new的一些原则:
a. 一般不要重写全局的operator new, 具体可以参考 不要重载全局 ::operator new
b. 如果重载了operator new, 同时提供所有版本(plain new, nothrow new, placement new)
c. 成对的提供new和delete, 即如果重载了operator new, 同时重载operator delete
阅读全文
posted @
2012-10-06 22:25 Richard Wei 阅读(2744) |
评论 (0) |
编辑 收藏
摘要: C++编程规范...
阅读全文
posted @
2012-10-06 20:05 Richard Wei 阅读(864) |
评论 (0) |
编辑 收藏
摘要: 看到ATL中有3个类的代码比较比较重复,在atlbase.h中,分别是CAutoVectorPtr, CAutoPtr和CAutoStackPtr,他们的功能其实很类似STL中的autoptr, 但是这里因为针对不同的分配对象而用了3个不同的类,其中CAutoVectorPtr是针对数组类型的,CAutoPtr是针对普通的非数组类型,而CAutoStackPtr针对的是_malloca分...
阅读全文
posted @
2012-09-24 22:59 Richard Wei 阅读(1855) |
评论 (4) |
编辑 收藏
摘要: 总之,拿着一把刀,庖丁解牛般的剖析语言背后的实现细节,看起来不是那么实用,但是它能让你对语言的理解更深刻。实际上ATL中大量应用上面的技术,如果没有对C++ 对象模型有比较深刻的理解,是很难深入下去的。
阅读全文
posted @
2012-09-21 23:02 Richard Wei 阅读(4128) |
评论 (2) |
编辑 收藏
摘要: 通过上面的分析,我们验证了平时C++书上关于各种类型变量存储区域的假设,简单来说就是全局变量和静态变量会被编译到可执行文件的数据节(分只读和可读写)中, 非静态的局部变量则分配在堆栈(stack)上,而new(malloc)出来的内存则分配在堆(heap)上。
阅读全文
posted @
2012-09-20 21:57 Richard Wei 阅读(2449) |
评论 (0) |
编辑 收藏
摘要: 通过上面的介绍,相信大家对程序内存有了比较全局的理解,以后大家分析问题,遇到一个地址,首先要判断这个地址分布在哪里:
如果是Image上,那么是在哪个模块中,这个地址是属于该模块的代码段(.text)还是数据段(.data),如果是代码段,又是属于哪个函数?
如果是Heap上,那么究竟是在哪个堆里面,是我们new出来的吗,是在什么时候new的(new时堆栈状况)?
如果是在Stack上,那么究竟是属于哪个线程的堆栈,当时线程的堆栈是怎么样?
总之,程序在内存中运行,只有你真正理解了内存,你才能真正懂计算机。
阅读全文
posted @
2012-09-19 23:24 Richard Wei 阅读(6834) |
评论 (6) |
编辑 收藏
摘要: 从上面的例子我们可以看到,对于可变参数的函数,有2种东西需要确定,一是可变参数的数量, 二是可变参数的类型,上面的例子中,参数数量我们是在第一个参数指定的,参数类型我们是自己约定的。这种方式在实际使用中显然是不方便,于是我们就有了_vsprintf, 我们根据一个格式化字符串的来表示可变参数的类型和数量,比如C教程中入门就要学习printf, sprintf等。
总的来说可变参数给我们提供了很高的灵活性和方便性,但是也给会造成不确定性,降低我们程序的安全性,很多时候可变参数数量或类型不匹配,就会造成一些不容察觉的问题,只有更好的理解它背后的原理,我们才能更好的驾驭它。
阅读全文
posted @
2012-09-18 00:04 Richard Wei 阅读(1953) |
评论 (0) |
编辑 收藏
摘要: 当然,上面几种DLL对外暴露接口的方式本质上没有区别,都是利用PE文件的导出节来导出数据和函数,但是根据它们使用方式的不同,对外部模块来说还是有很大的区别,我们的推荐次序依次是:COM方式->导出API函数方式->导出类方式。
阅读全文
posted @
2012-08-29 18:58 Richard Wei 阅读(4188) |
评论 (0) |
编辑 收藏
摘要: 最后简单比较下上面3种实现回调的方法:
第一种Callback的方法是面向过程的,使用简单而且灵活,正如C语言本身。
第二种Sink的方法是面向对象的,在C++里使用较多, 可以在一个Sink里封装一组回调接口,适用于一系列比较固定的回调事件。
第三种Delegate的方法也是面向对象的,和Sink封装一组接口不同,Delegate的封装是以函数为单位,粒度比Sink更小更灵活。
阅读全文
posted @
2012-08-28 12:36 Richard Wei 阅读(4988) |
评论 (3) |
编辑 收藏
摘要: 在网上关于窗口视觉效果,有2个问题被问得最多:
第一个是如何让窗口边框有阴影效果?
第二个是如何让窗口控件有半透明效果?
阅读全文
posted @
2012-08-23 00:38 Richard Wei 阅读(7252) |
评论 (4) |
编辑 收藏
摘要: 总的来说DirectUI是趋势,而微软的WPF代表了DirectUI最先进的技术方向,换肤对于DirectUI来说非常容易。随着Win7,Win8 的普及,传统界面库的市场会越来越小,一来因为系统本身已经很炫了,二来微软自己的WPF和Xaml技术基本上已经可以实现任何想要的效果。当然只要XP不消亡,传统的界面库还是有自己的一席之地。
阅读全文
posted @
2012-08-21 22:33 Richard Wei 阅读(5999) |
评论 (2) |
编辑 收藏
摘要: 主要特性:
(1)软件小而高效,使用流畅,设计人性化
(2)支持截图区域的手工选择和根据窗口自动识别选择
(3)支持矩形,圆形,直线,箭头,画笔,文本等注释工具
(4)支持橡皮擦除功能
(5)无限次数的撤销和重做
(6)支持鼠标光标的截取
(7)支持鼠标区域跟踪和放大
(8)支持各种图像文件格式的保存和编辑
(9)支持多显示器
(10)支持换肤和多语言
阅读全文
posted @
2012-08-21 00:02 Richard Wei 阅读(7119) |
评论 (19) |
编辑 收藏
摘要: 做为一名Windows平台上的C/C++开发人员,我们有N个理由学习WinDbg的使用:
有些Bug只有在客户和QA的机器上才能重现,我们不可能在他们的机器上装一个VC吧
WinDbg可以让我们方便的保存和分析Dump文件
WinDbg的调试功能比VC强大的多,比如它有强大的API断点和条件断点
调试内核和驱动,我们只能用WinDbg
用WinDbg可以让你更深入的理解系统,理解计算机,用VC你看到的是自己的代码,用WinDbg你看到的是整个进程
......
最重要的,微软用WinDbg开发和调试Windows操作系统,它是Windows平台上最重要的调试工具.
阅读全文
posted @
2012-08-15 14:12 Richard Wei 阅读(4485) |
评论 (6) |
编辑 收藏
摘要: 经常有初学者询问如何学习Windows编程?
很多人从MFC开始学习,结果常常是一头雾水,知难而退;也有人毅力坚强,熬过了MFC的阵痛期,最后却是知其然而不知其所以然,并且思维被限制在MFC的框架之中,遇到稍微有点规模的程序就无从下手了。
阅读全文
posted @
2012-08-15 13:37 Richard Wei 阅读(7542) |
评论 (5) |
编辑 收藏
摘要: 那么Windbg分析Dump时,会如何推理堆栈过程呢?
如果每个函数都是有标准的push ebp, 那么按照ebp递推就可以了;
否这就只能用其他方法分析,比如看看堆栈里某个地址是不是函数返回地址(该地址属于某个模块的代码段),这样就可以确定该地址是某个函数堆栈桢的起始地址。
阅读全文
posted @
2012-07-20 14:00 Richard Wei 阅读(5297) |
评论 (3) |
编辑 收藏
摘要: 今天遇到一个比较奇怪的crash问题,这里记录下。这个crash是由QA设置了一些不合理的参数引起的,还好QA当时保存了Dump文件,让我们可以慢慢分析,从而找出代码中隐藏的问题。
阅读全文
posted @
2012-07-13 21:27 Richard Wei 阅读(3830) |
评论 (4) |
编辑 收藏
摘要: 运行库,数据节, 代码节
阅读全文
posted @
2012-07-07 15:17 Richard Wei 阅读(5375) |
评论 (1) |
编辑 收藏
摘要: 这个DirectUI界面库主要参考一个老外的程序, 支持各种Layout模式,实现了各种基本控件(SplitBar, PictureBox, Button, Radio, CheckBox, Label, HyperLink, ProgressBar, trackBar, ListBox, Edit, ComboBox, Tab Control, Toolbar, Menu, tree),支持键盘导航,支持Tooltip,支持多语言,支持换肤,支持异形窗口,支持Layered Window, 支持插件2次开发,支持Alpha通道,支持各种图像处理。
阅读全文
posted @
2012-07-03 23:18 Richard Wei 阅读(36028) |
评论 (35) |
编辑 收藏
摘要: 可以看到无论对于开发还是测试人员,windbg很多时候可以帮我们快速的定位问题, 如果借助符号文件,Windbg完全可以实现比VC IDE更强大的调试供功能, 并且有时候我们不需要源代码,不需要重新编译,直接就可以通过windbg调试和解决问题。
阅读全文
posted @
2012-06-26 20:33 Richard Wei 阅读(3637) |
评论 (3) |
编辑 收藏
摘要: 正如我们不能确定微软的Win8 Metro能否成功,我们现在还不能确定这种PC没落的趋势是否会持续下去, 新生平台究竟会是昙花一现,还是主流趋势? 作为一名技术人员,有时候真的很无奈,虽然理论上计算机的本质和设计思想永远不会过时, 但是你一旦停止了自身对新技术的汲取,你可能会很快被淘汰。
阅读全文
posted @
2012-06-21 22:36 Richard Wei 阅读(4223) |
评论 (6) |
编辑 收藏
摘要: 远程线程作为一项"合法"的代码注入技术,在windows上被大量使用, 它的本质就是把一块可执行代码写入到对方进程,然后让其起运行。
一般它的实现过程是这样的, 通过VirtualAllocEx在目标进程分配内存空间,然后通过WriteProcessMemory将我们的可执行代码写入到目标进程,最后通过CreateRemoteThread让我们的可执行代码在目标进称里运行起来。
阅读全文
posted @
2012-06-20 15:38 Richard Wei 阅读(3955) |
评论 (5) |
编辑 收藏
摘要: 从理论上来说,Metro开发也是windows上最新技术的集合,有C++11的支持,有GPU加速支持的D3D(D2D)引擎,有面向对象的跨语言(元数据描述)的WinRT类库,有通过标记(XAML)描述的界面, 而且它是Native的(非托管),所以性能上也有保障。
阅读全文
posted @
2012-06-15 09:19 Richard Wei 阅读(4220) |
评论 (6) |
编辑 收藏
摘要: 我们发现设计模式在Java社区很流行,但是在C++社区却没有那么被关注,甚至有点被排斥,究竟是什么原因造成这个差异的呢?
阅读全文
posted @
2012-06-14 09:22 Richard Wei 阅读(5332) |
评论 (13) |
编辑 收藏
摘要: 那么究竟什么时候适用这种接口方式呢?
我的看法是只有当你的模块是一个单独的子系统,当对外提供功能时,才可以这么做。这里的子系统不一定要是一个很大的概念,比如一个窗口,一个COM对象都可以称为简单的子系统,但是它的前提要求是独立,对外,并且最好你可以预见到以后它的功能会改变和扩充。
阅读全文
posted @
2012-06-13 10:08 Richard Wei 阅读(3339) |
评论 (5) |
编辑 收藏
摘要: 可以看到使用第二种实现我们只存储了一份字符串图像数据,同时有保留了图像的层次和结构属性,实现时包含了很多设计模式,比如Template, Decorate, Composite, Facade等,简单而高效。
阅读全文
posted @
2012-06-12 09:31 Richard Wei 阅读(5423) |
评论 (10) |
编辑 收藏
摘要: 在写DirectUI时有这么一个需求,就是加载一串XML,如何生成一棵对应的控件树?
阅读全文
posted @
2012-06-10 17:31 Richard Wei 阅读(4509) |
评论 (4) |
编辑 收藏
摘要: 思考一个优秀windows C++ 程序员该有哪些知识,可最终发现什么知识都不能少, 看下图:
PS: 和同事讨论, 其他职业(比如司机或是厨师),他们只要学完基本的技能后就可以一劳永逸了,学的知识也比我们少的多,也不用担心新技术的更替。
所以感觉程序员真的挺累, 如果不是出于兴趣,注定是干不久的; 付出这么多,工资比其他职业高一点,其实并没赚到什么。
呵呵,不知大家怎么看?
阅读全文
posted @
2012-06-10 12:36 Richard Wei 阅读(10449) |
评论 (16) |
编辑 收藏
摘要: Windbg的命令分为标准命令,原命令和扩展命令,输入问号(?)可以显示所有的标准命令的帮助信息; 元命令以一个点(.)开始,输入.help可以显示所有的原命令的帮助信息;扩展命令以叹号(!)开始
阅读全文
posted @
2012-06-07 19:07 Richard Wei 阅读(22960) |
评论 (1) |
编辑 收藏
摘要: Lambda, auto, 统一初始化,智能指针,Regex, Random,
function and bind, hash_map…
右值引用和Move语义, 并发(多线程库)…发布
阅读全文
posted @
2012-06-06 17:34 Richard Wei 阅读(3499) |
评论 (4) |
编辑 收藏
摘要: 介绍如何让自己的程序支持Javascript脚本, 并提供一个简单的Demo
阅读全文
posted @
2012-05-19 11:59 Richard Wei 阅读(15902) |
评论 (0) |
编辑 收藏
摘要: Win8 Metro 相关的一些开发资料
阅读全文
posted @
2012-05-17 17:46 Richard Wei 阅读(1073) |
评论 (0) |
编辑 收藏
摘要: widnows下多用户多桌面的原理
阅读全文
posted @
2012-05-12 23:37 Richard Wei 阅读(4354) |
评论 (0) |
编辑 收藏
摘要: 在帖子 "如何判断一个C++对象是否在堆栈上” 中, 又有人提出如何判断一个C++对象是否在堆上。
阅读全文
posted @
2012-05-12 14:30 Richard Wei 阅读(5350) |
评论 (8) |
编辑 收藏
摘要: 要解答这个问题,其实就是要知道的堆栈的起始地址, 而我们知道堆栈其实就是一段有相同属性的内存页面
阅读全文
posted @
2012-05-12 10:57 Richard Wei 阅读(5596) |
评论 (9) |
编辑 收藏
摘要: 新版的QQ在截图时加入了窗口自动识别的功能,能根据鼠标的位置自动画出下面窗口的轮廓。今天有人在论坛上问起这个问题,下面我们来探讨这个功能的实现原理。
阅读全文
posted @
2012-05-06 21:34 Richard Wei 阅读(12126) |
评论 (9) |
编辑 收藏
摘要: 在高效C++编程中看到一个不错的内存池实现方案,这里共享下,大家看看有什么不足。
阅读全文
posted @
2012-05-05 23:23 Richard Wei 阅读(18323) |
评论 (12) |
编辑 收藏
摘要: 引用计数在软件开发中是一项非常重用的技术,它可以说是无处不,我们在不知不觉中都在和它打交道,比如 Windows上的COM和Handle, Mac上的ref句柄,脚本语言中的垃圾回收技术。
阅读全文
posted @
2012-05-05 17:04 Richard Wei 阅读(4959) |
评论 (4) |
编辑 收藏
摘要: 好我一个月前看到一个视频,这个演讲视频还比较著名,这个演讲者是Exceptional C++ 和 C++ Coding Standards 的作者,还是ISO C++ 委员会的Chair,C++/CLI首席架构师,还是Microsoft的软件架构师,他叫Herb Sutter,他的这个演讲视频是 C++ and Beyond 2011上的一次公开演讲,题目是——Why C++? (如果你觉得那里的视频比较慢,你可以看优酷上的视频)(英文听力好的同学可以看一样,因为都没有中文字幕)
阅读全文
posted @
2012-05-04 22:16 Richard Wei 阅读(1667) |
评论 (0) |
编辑 收藏