- 博客(31)
- 资源 (5)
- 收藏
- 关注
原创 告别优快云,转去博客园(http://www.cnblogs.com/organic/)
在优快云开博客的时间不长,陆陆续续也写了一些文章,但10月后优快云写的博客除了专家外很难能够上到博客首页上去了,不论写的质量怎么样,长期在博客首页看到的都是专家的文章,诚然,专家写的文章质量肯定不低,但这样很明显打击了我们这些新鲜的血液,如果自己写的博客不是为了分享,还不如写在印象笔记里给自己看,每写一篇博客都要花费2,3个小时的时间,就是由于有份分享的精神及博友支持的力量在驱动,如今优快云
2015-11-30 01:09:00
965
原创 Windbg跟踪临界区的BUG
最近跟踪了一个程序的界面卡死问题,该卡死偶尔出现,在抓到一次dump后用windbg载入分析,打印出函数调用堆栈后,一眼可以看出是临界区死锁了。代码:0:000:x86> kbChildEBP RetAddr Args to Child 0032dd0c 779ed993 00000710 00000000 00000000 ntdll_779b00
2015-10-23 23:26:40
1301
转载 Unix哲学
01.模块原则:使用简洁的接口拼合简单的部件。 02.清晰原则:清晰胜于机巧。 03.组合原则:设计时考虑拼接组合。 04.分离原则:策略同机制分离,接口同引擎分离。 05.简洁原则:设计要简洁,复杂度能低则低。 06.吝啬原则:除非确无它法,不要编写庞大的程序。 07.透明性原则:设计要可见,以便审查和调试。 08.健壮原则:健壮源于透明与简洁。 09.表示原
2015-10-05 17:22:44
509
原创 使用Windbg在XP下Heap追踪失败的原因
Windbg开启页堆进行用户态栈回溯在Win7上成功,但在XP上却提示“ReadMemory error for address eeddccee”,原因竟是Windbg的版本过高,当工具也会出问题,当高版本软件不可信任,我们该如何处理,这里就展示一次蛋疼的Debug Heap Page出错的跟踪之旅...
2015-09-13 09:20:55
1309
原创 C++浅析——虚表和虚表Hook
1、虚表位于何处?2、同一个类对象的虚表位置相同吗?3、虚表需要在加载后进行初始化吗?4、多父类继承的虚表如何存放?5、何为虚表Hook?
2015-08-08 09:40:35
4523
原创 大话设计模式C++版——装饰模式
女人常说男人喜新厌旧,只见新人笑,那闻旧人哭,但装饰模式(Decorator)却是一种结交新朋友不忘老朋友的设计模式,非常适合去古代当老公(现代是不行的,因为只能娶一个老婆了)。装饰模式的本质是每一个装饰对象都被保留一个被其装饰的对象,装饰对象在展示新功能时会同时去掉用被其装饰的对象的同功能函数,通过如此层层包含调用(即装饰),形成一个类似链表的结构,接下来的介绍中,我们还会看到更多的类似链表结构的设计模式,比如职责链模式、状态模式。 仍以《大话设计模式》一书中装饰模式的小菜穿衣的例子为例,来看看装
2015-07-04 10:17:30
1104
原创 一次Mutex死锁的原因探究
1、现象 最近项目中调出一个bug,某些时候程序会卡死不动,用windbg进行加载后用 ~*kb 命令列出所有的线程栈调用,发现有多个线程调用 WaitForMultipleObjects 在等待同一个内核对象:
2015-07-04 09:14:18
3657
转载 谁在死锁Mutex——用Windbg查找Mutex死锁所有者线程
Who is blocking that Mutex? - Fun with WinDbg, CDB and KD05Aug 2006By Ingo RammerI'm currently toying with the idea of creating a small frontend to SOS.DLL (CDB/WinDb
2015-07-01 20:57:43
3071
转载 COM中的线程模式
Choosing the threading model for an object depends on the object's function. An object that does extensive I/O might support free-threading to provide maximum response to clients by allowing interface
2015-06-28 20:37:32
1440
原创 大话设计模式C++版——建造者模式
日常做菜的过程中,经常会有忘记放盐或者放2次盐的经历,最后导致好好的一盘菜让大家无从下口。这个时候就需要用到建造者模式来规范炒菜的过程,来保证每一道菜都会经历加油、放食物、放盐、放味精这4道基本的工序,同时保证每道工序不会重复。
2015-06-28 12:28:34
1207
原创 大话设计模式C++版——观察者模式
观察者模式是一种类似于消息分发的模式,用于一个任务需要被多个对象监听的场景,或者成员对象需要反向通知类对象的情况,是一种很有用的设计模式。 这里以大话设计模式中的例子为例,办公室员工A、B、C在看股票看电影,这时老板回来了,被A、B、C重金贿赂后的前台MM发出通知给A、B、C,A、B、C收到通知后赶紧关电脑,关股票窗口,装作在干活。
2015-06-28 09:24:59
851
原创 大话设计模式C++版——代理模式
本篇开始前先发个福利,程杰的《大话设计模式》一书高清电子版(带目录)已上传至优快云,免积分下载。下载地址:http://download.youkuaiyun.com/detail/gufeng99/8843487 代理模式是一种比较简单但却实用的设计模式,他可以灵活的更换代理的对象,但保证功能的完整性,就如卖衣服的代理商,他可以代理美特斯邦威的衣服,如果美特斯邦威的衣服被大家吐槽不好卖了,他还可以换去代理卖佐丹奴的,但不管怎么更换,还是能满足大家的需求——买衣服。
2015-06-27 09:50:28
1191
原创 大话设计模式C++版——工厂模式在COM中的典型应用
上篇《大话设计模式C++版——抽象工厂模式》中,我们拯救世界未遂,留下小小的遗憾,本篇中我们将给出一个解决方案——COM组件技术,同时也顺便扯扯工厂模式在COM组件技术中的应用。 工厂模式违背开放—封闭原则的根本原因在于对象的产生无法通过客户模块外的数据进行控制,如果我们能从xml、注册表、配置文件中写入一个类的名字,然后模块从中读出类名,并根据读出的类名创建对象,那不就和C#高大上的反射技术一样牛B哄哄了。非常幸运,微软的COM组件技术就提供了这么一个平台。
2015-06-15 09:26:39
1228
原创 大话设计模式C++版——抽象工厂模式
前面说过,简单工厂模式是最基础的一种设计模式,那以工厂命名的设计模式就是23种设计模式中最多的一种,他们一脉相承,一步一步进化而来,这里就是其中的最后一种——抽象工厂模式(Abstract Factory),其是在工厂方法模式的基础上改进而来,如果没有弄明白工厂方法模式的同学请先观看《大话设计模式C++版——工厂方法模式》。 为什么会有抽象工厂模式?抽象工厂模式是简单工厂模式缺陷的终极解决方式么?NO,抽象工厂模式并不是为了解决简单工厂模式的缺陷而活着,它是因为有新的使命而诞生。 一个简单的例子,有
2015-06-13 22:55:37
1200
原创 大话设计模式C++版——工厂方法模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览《大话设计模式C++版——简单工厂模式》。在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放—封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例。
2015-06-13 20:48:36
860
原创 exe文件无法打开
1、现象在一个XP 64位机子上从IE下载一个exe文件后,双击竟然无任何反应,以为文件有问题,但多次尝试后仍是如此,但打开cmd通过命令行启动是正常,双击该机子上其他exe文件也都能启动,但从IE上下载的就是不行。
2015-06-13 11:10:05
1597
转载 数据驱动编程之表驱动法
本文示例代码采用的是c语言。之前介绍过数据驱动编程《什么是数据驱动编程》。里面介绍了一个简单的数据驱动手法。今天更进一步,介绍一个稍微复杂,更加实用的一点手法——表驱动法。关于表驱动法,在《unix编程艺术》中有提到,更详细的描述可以看一下《代码大全》,有一章专门进行描述(大概是第八章)。简单的表驱动:《什么是数据驱动编程》中有一个代码示例。它其实也可以看做是一种表驱动手法,只
2015-05-23 11:19:58
1390
原创 大话设计模式C++版——表驱动法改造简单工厂
上回《大话设计模式C++版——简单工厂模式》中指出了简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,如何改造switch结构,表驱动法就可以粉墨登场了。表驱动法的介绍见《数据驱动编程之表驱动法》。1、面向接口编程,先改造抽象接口类IOperationclass IOperation{p
2015-05-23 10:38:55
1650
原创 大话设计模式C++版——简单工厂模式
简单工厂模式应该是所有设计模式中最简单,也最基础的一种模式,以下是一个简单的采用工厂模式写一个加减法的计算器。1、抽象接口类——依赖倒转原则(高层和底层都要依赖于抽象,针对接口编程)class IOperation{public: IOperation() : m_nNuml(0), m_nNumr(0) {} virtual ~IOperation() {} vir
2015-05-23 09:06:44
2635
原创 大话设计模式C++版——原则和引言
读程杰的《大话设计模式》有一段时间了,将其C#版的设计模式代码用C++全部重新实现了一遍,并记下个人的一些心得,同时也对一些设计模式进行了改造。网上有份《大话设计模式实现(C++版)》的资料,但稍看后错误不少,比如用作接口的基类不将析构函数申明为虚函数,仅内部使用的成员变量不申明为private(公然违背迪米特法则),new出的对象不进行释放等等一些错误或不良编码习惯,易误导新学C++的同学。故我将我个人实现的C++献丑放出,欢迎大家批评指正,共同进步。
2015-05-18 23:49:49
1561
原创 VS2010最常用快捷键
1、选择类F8当前位置变成选定区域的头/尾(再移动光标或者点鼠标就会选定)Ctrl + F8当前行变成选定区域的头/尾(再移动上下光标或者点鼠标就会选定多行)CTRL + W选择当前单词Ctrl + Shift + ←选定当前位置到前一个单词Ctrl + Shift + →选定当前位置到后一个单词Shift
2015-05-18 14:52:39
528
原创 Interlocked系列函数线程同步的缺陷
1、 Codeint Work(){ while (m_lInterlockedData < 10) { InterlockedIncrement(&m_lInterlockedData); Sleep(100); } printf("CInterlocked::Work end\n"); return 0;}起5个线程运行Work()函数,理论上m_l
2015-05-16 00:52:25
664
原创 C++浅析——继承类内存分布和虚析构函数
继承类研究1、 Code1.1 Cbase, CTEST为基类,CTest2为其继承类,并重新申明了基类中的同名变量class CBase{public: int Data; CBase(); ~CBase();};class CTEST{ //Data:private:
2015-05-16 00:44:51
707
原创 C++浅析——返回对象的函数
一、原码分析1.1 测试代码 为了方便查看拷贝构造函数调用过程,自定义了拷贝构造函数,但啥也没干。class CTEST{public: int m_nData; //Method:public: CTEST() { printf("0x%p CT
2015-05-16 00:32:33
665
原创 C++浅析——虚函数的动态和静态绑定
源自一道面试题,觉得很有意思class CBase{public: virtual void PrintData(int nData = 111);};void CBase::PrintData(int nData /* = 111 */){ printf("CBase::PrintData, nData = %d\n",
2015-05-16 00:22:34
673
原创 C++浅析——继承类中构造和析构顺序
先看测试代码,CTEST 继承自CBase,并包含一个CMember成员对象:static int nIndex = 1;class CMember{public: CMember() { printf("%d CMember construct\n", nIndex++); }
2015-05-16 00:19:54
509
原创 智能指针介绍
智能指针是为了解决程序员创建了资源而忘记释放造成内存泄漏的问题,可减少代码编写过程中的代码长度,减少程序员对资源管理的难度,因而在COM组件及各类插件中有广泛应用。1、智能指针的原理 智能指针的原理是利用对象在离开作用域时会调用对象的析构函数,将资源指针封装进类中,并将资源指针的释放过程写入析构函数中,这样就能在对象释放时自动释放资源。一个管理注册表句柄的智能指针示例如下:
2015-05-15 23:56:14
604
原创 CoCreateInstance调用COM接口伪流程
在编写组件程序时,经常会使用CoCreateInstance直接取COM组件的接口,非常方便,那CoCreateInstance到底干了些什么事呢?1、CoCreateInstance取COM组件的接口的基本流程//参数:rclsid = 组件CLSID//参数:riid = 接口IDWINOLEAPI CoCreateInstance(REFCLSID rclsid, LPU
2015-05-15 23:49:50
1751
原创 编写NPAPI plugin的命名问题
最近写了个NPAPI的插件,在chrome上用得好好的,结果在火狐上死活不认我的插件,找了N多资料最后在官方的说明里才找到说火狐浏览器的插件的文件名必须是以np开头的,立刻吐血三升,难怪被chrome抛弃。
2015-05-15 23:37:37
651
原创 搜狗浏览器查看合法插件的方法
大家都知道在chrome中查看浏览器支持插件是在地址栏输入 chrome://plugins 即可,但搜狗浏览器虽然是基于chromium内核的,但用此方法却不行。 但可按F12调出控制台面板,然后输入navigator.plugins,是在地址栏只要是chromium内核的浏览器都可使用这种方法。
2015-05-15 23:35:02
2796
原创 网页中调起本地程序系列——简介篇
由于网页及浏览器的各种限制,很多事情我们通过js等编码并不能达到我们想要的目的,我们需要调起本地执行程序来帮助我们做一些更强大的事情,这时候问题来了,如何才能调起我们本地程序?下面列出目前可用的几种方法及其缺陷(主要以IE和Chrome浏览器为例)。1、使用网页控件1.1 IE浏览器1.1.1 IE中可使用ActiveX控件调用本地控件,也可通过BHO调用,当然BHO
2015-05-15 23:28:31
1539
Windbg6.6.0007.5
2015-09-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人