自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

win2ks

山高月小 水落石出

  • 博客(116)
  • 收藏
  • 关注

原创 typelist的用途

曾几何时,在搜索引擎里反复搜索typelist的用途,试图理解loki里这个“火星的生产力”,但终无所获。  今天,终于理解了火星的生产力是个什么东西,这真的是地球上没有的东西耶。  给曾经像我一样迷茫的人指一条路吧:如果你真的想不到typelist的用途,那是因为确实没

2011-08-31 23:44:43 1060

原创 代码的持续可用性

代码的可维护性这个话题已经提了很多年了,但从最好的方案其实只是最适合自己的方案的角度思考,代码的可维护性说成代码的持续可用性更现实,更适合我们的目标。代码的持续可用性说的是今天写的代码可以适用未来的需求,相同的工作不需要重复做。但是,明眼人看到这里肯定会笑了,这是一个看起

2011-08-06 00:20:05 2110 1

原创 软件工程的特点

从字面上来说,软件工程是一种工程,但从圈里的人的体会来说,软件工程是很有特点的一种工程:你有很多方案到达终点,而这些方案中没有好坏之分。找的一个方案往往不是太难,一个被找到的方案肯定不是错的,但是,找到一个真正适合你的方案却比较难。 软件工程是一种寻找最合适自己方

2011-08-05 23:53:16 4371

原创 双向容器

  有时候,解决问题的方法只是简单的换一下思维。  曾经有段时间我特别喜欢id号这个东西,那个时候的程序里可以看到各种各样“有明确意义”的索引,指针、字符串最常见,现在翻番那个时候的东西,觉得很幼稚很天真丷丷,闲来没事做一些优化,碰到了一个双向查找的问题,有时候我需要使用key找value,有时候又需要通过value找特定的key,其实很简单,真有这种需求的话做两个哈希表互相颠倒key-val

2008-07-11 17:30:00 940

原创 ACE_Proactor框架代码简析

  这个框架里涉及了ACE_Handler相关继承体系里的几个类,我只是随需查看。1.ACE_Proactor(以及ACE_WIN32_Proactor——the Impl)  ACE_Proactor需要桥接ACE_Proactor_Impl,在win32上,这个ACE_Proactor_Impl是完成端口的封装(服务器开发者们眼睛要绿的丷丷),也就是说,win32上的Proactor就

2008-07-05 16:09:00 4483 1

原创 从应用层次探讨Reactor

操作系统已经提供了Reactor机制,核心表现是select方法。ACE的Reactor其实是对类select的操作系统方法的封装。  我这里都使用select方法举例讨论。  使用select方法,需要把socket压入FD_SET,使用select方法获取一次事件。在这个过程中,我们针对特定的事件进行反映,因此称为reactor。  ACE使用面对对象的思想对reactor进行了封

2008-07-05 00:05:00 1375 1

原创 主流同步锁模式

  优秀的模式具有通用性,因为它本书就是经验、优点的提炼、升华。  线程同步最大的问题是死锁问题,而白痴级的死锁是加锁后忘了释放或由于某种未考虑到的条件发生而导致无法释放。  类的构造函数、析构函数机制与C++栈上变量的生存法则结合,给了C++程序员无线的遐想(在这个基础上衍生出来的种种技巧到底是天使还是恶魔,我不去多想)。  ATL里主流CriticalSection封装类有两个,一

2008-07-03 23:30:00 944

原创 慎用TerminateThread

using namespace yaogl;ThreadMutex g_mutex;void tellme(void* p){ for (int i = 0;i < 100; ++i) { ThreadAutoMutex mutex(g_mutex); printf("%d/n",i); }}

2008-07-02 23:43:00 1929

原创 TcpClient、TcpListener和UdpClient以及数据转换

  TcpClient、TcpListener和UdpClient是帮我们节省代码的类(封装类?丷丷,道理一样啦)。  TcpListener提供了AcceptSocket和AcceptTcpClient方法,TcpClient提供GetStream方法获取NetworkStream。对应udp协议有UdpClient。  BitConverter提供了数据类型转换帮助。

2008-06-19 00:16:00 1692

原创 winsock缓冲的拆分包问题

  逻辑上的一次发送未必就以一个单独的包发送出去,逻辑上的多次调用未必就是多个包被发送出去,这其中的秘密就是winsock缓冲区。调用flush可以强制发空当前缓冲数据,但是接收者还是未必一次收够或单次不多收。  使用NetworkStream可以在我们的程序中再设立一层缓冲,但真正的意义是在这层缓冲上,我们可以使用StreamReader和StreamWriter两个流,而这两个流可以使用R

2008-06-18 23:39:00 1119

原创 C#网络编程之Hello World

  C++网络编程第一个程序恐怕都是sockaddr_in、socket、bind、listen、accept、recv/send、closesocket一套流程,C#一样可以这么做,而且还很有ACE类别封装的思想。 public static void Main(string[] args) { //sockaddr_in a

2008-06-18 21:01:00 730

原创 使用完成端口框架开发异步模块

  完成端口模型可以让我们基于传递overlapped数据的思想分解异步操作,让操作系统帮我们做线程间的数据传递。基于这个思想,可以把bsdsocket改造成异步模型,尽管这样做效率上意义不大,但对于想模拟ms完成端口都网络模型的人来说,可以小圆梦想了。static HANDLE g_hiocp;static DWORD WINAPI worker(LPVOID pvd);

2008-06-18 15:01:00 1022

原创 完成端口cookbook

  在服务器开发上虚度日月久矣,每次新的开发都要重新写一遍netlayer,厌烦了这种事情想做一个类库给自己的时候,一直使用完成端口做网络层没有错,但是不去深刻理解完成端口的本质就不对了,而且在该使用这个强力工具的时候没有想起使用却是大大的错了。  cookbook只讲step by step创建一个完成端口模块(网络)。  意识到线程切换的巨大代价,NT小组开发了完成端口这个内核级的东西

2008-06-18 14:26:00 1123

原创 GetQueuedCompletionStatus一直阻塞

  使用WSASend或WSARecv投递相应的发送或接收请求后,始终没有收到相应返回通知,或者另外一个问题,在使用完成端口时,GetQueuedCompletionStatus一直阻塞,这都是由WSARecv或WSASend函数的调用参数未初始化造成的。  已经有好几次碰到这个问题了,出现问题调试出来才又一次的感觉到事情的严重性。要养成初始化参数的好习惯。

2008-06-18 01:45:00 4385 1

原创 闲侃完成端口

  ACE是个好东东,可是真正用的时候,我还是忍不住重新造车轮。做网络层的时候,考虑了一下还是自己做吧(并不是我觉得ACE不好或不方便,只是因为自己ACE不精,怕乱舞伤了自己)。  从好多方面来说,我都是c++的铁杆,自己给自己的评价是对c++有较深入的认识。不过因为闲时太喜欢做coding游戏,为了节省时间快速见效,投奔锐利c(c#,嘿嘿)了。扯远了,当用c#造车轮的时候,我想到了尽可能使用

2008-06-18 00:37:00 1001

转载 Calling Managed .NET C# COM Objects from Unmanaged C++ Code

  C#创建、使用组件都非常简单,但像我这样的偏执狂自然想用C#创建一个传统的com server,终于找到了一篇文章,创建是可以不过比较麻烦,专用名词叫Calling Managed .NET C# COM Objects from Unmanaged C++ Code,简单试验了一下,我觉得,除非必须这样做,我再也不想用C#给C++写com了。  原文的地址是:http://www.cod

2008-06-17 22:16:00 1078

原创 ATL中的线程安全(AC9)

  AC9,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第九部分。  ATL中的线程安全是由CXXXxxxCriticalSection提供的,使用的policy策略,使用者可以得到Lock、Unlock两个方法来处理同步问题,而且,ATL的诸多policy给使用者提供了恰好足够的线程安全。注意恰好足够的说法,也就是说首先它够用,更重要的是没有额外负担。  

2008-06-13 18:20:00 1745

原创 通过BEGIN_COM_MAP看接口的三剑客的实现和调用(AC8)

  AC8,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第八部分。  接口三剑客AddRef、Release、QueryInterface不用说了,他是在CComObjectRootEx中被实现的,但是调用过程却不是简单的依照虚函数路线向上查找到了这个类,而是由通过了系列宏BEGIN_COM_MAP。  已经说过,我们使用ATL向导添加的class不是最终的

2008-06-13 15:50:00 6436 4

原创 各个类的协作关系(AC7)

  AC7,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第七部分。  这是张我自己分析ATL向导默认com代码画的一张图,有80多k,比较大,打不开也没关系,翻翻向导生成的代码自己也能感觉到。  发现图片竟然显示不全,无语了,这是图片地址。

2008-06-13 09:06:00 1264

原创 聚合其他接口三部曲(AC6)

  AC6,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第六部分。  ATL向导可以帮我们生成可以被聚合的接口,但是如果一个接口要聚合其他接口,需要下面三个步骤。  1.定义IUnknown指针   2.在FinalConstruct中创建获取IUnknown指针,在FinalRelease中释放。   3.使用COM_INTERFACE_ENTRY

2008-06-13 08:51:00 1377 1

原创 进程内COM对象的创建过程(AC5)

  AC5,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第五部分。  Com库创建COM对象可以使用三个方法:CoCreateInstance(IN REFCLSID rclsid, IN LPUNKNOWN pUnkOuter, IN DWORD dwClsContext, IN REFIID riid, OUT LPVOID FAR* ppv);

2008-06-13 00:48:00 3247 1

原创 简述ATL Default Com中用到的几个宏(AC4)

  AC4,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第四部分。  ATL中的宏很多,我看代码有个不太喜欢拆开宏的习惯,在没分析这些宏的时候,总觉得见了不少树木却不见树林,现在才明白,ATL中的宏宛如手术刀一样切入了各个类的内部,而且不少宏充当了ATL骨架的功能。所以如果要看ms vs appwizzard生成的代码,一定要先研究用到的宏。  相对来说宏还

2008-06-12 23:27:00 1696

原创 _ATL_OBJMAP_ENTRY详解(AC3)

  AC3,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第三部分。  当此DLL映射到进程的地址空间中,系统实际调用的是_DllMainCRTStartUp而不是DllMain。_DllMainCRTStartUp函数初始化C运行时库并在其收到DLL_PROCESS_ATTACH通知时创建所有全局的或静态的C++对象。在C运行时库初始化完成之后,_DllMain

2008-06-12 23:06:00 4157

原创 OBJECT_ENTRY_AUTO的背后(AC2)

  AC2,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第二部分。  OBJECT_ENTRY_AUTO相当不起眼的放在我们声明的类的头文件的最底行,但是位置不起眼作用却相当大,我给它的评价是ATL COM的基石。  以XXX表示我们自己的com对象类,OBJECT_ENTRY_AUTO在我们的类名和iid上扩展为(我多贴了其他#pragma)://

2008-06-12 22:03:00 6039

原创 __declspec(allocate("segname"))和__declspec( selectany )(AC1)

  AC1,由VS2005的ATL向导生成的默认COM对象代码分析ATL如何实现COM,第一部分。  为了多多研习ATL想到生成的代码,visio、rose、word、excel加上我的笔本全上阵,终于把各个模板类混了个了解、跟宏混了个脸熟。当我借助调试器想把一个classfactory和com对象的由来看个明白的时候,我发现疑惑很多。不过好在简单看出了点门道,但要说清楚,非三言两语可以完成,

2008-06-12 00:52:00 4621

原创 CAutoPtr和CAutoVectorPtr

  C++程序员一定很熟悉CAutoPtr,至少它是我接触到的第一个智能指针,而且这个指针转移控制权,这是它非常大一个特色,ATL里也有这个,和STL里是一个东西,只不过这个没有支持异常(没有编译进去)。CAutoVectorPtr是只能数组指针,特别地,它没有构造函数,所以使用起来要分为声明和分配两步。 CAutoPtr pap(new SomeClass); pap->doSomeTh

2008-06-10 13:27:00 3091

原创 CComPtr和CComQIPtr

  这里两个对接口指针的封装类,也就是智能指针,使用只能指针有如下优势:  1.析够函数自动释放接口指针  2.处理异常时智能指针可以自动析够  3.赋值操作可以自动处理释放、AddRef的资源管理  4.构造函数、类型转换等自动处理了类似QI等若干问题  CComQIPtr继承了CComPtr,使用CComPtr的地方都可以使用CComQIPtr,而且使用CComQIPtr的地方多数也可

2008-06-10 12:20:00 3758

原创 CComSafeArray

  首先Com提供语言无关的array,我们可以这样使用: //定义safe array bound SAFEARRAYBOUND rgsabound[2]; rgsabound[0].cElements = 3; rgsabound[0].lLbound = 0; rgsabound[1].cElements = 4; rgsabound[1].lLbound = 0;

2008-06-10 00:50:00 3134

原创 CComVariant相关

  与使用BSTR相较而言,使用VARIANT算比较简单了,设置了类型信息和数据就完事,而且,从内存管理的角度来说,VARIANT的内存方式也相对接近常规化,因不了解而出问题的概率大大减少了,但是,为了避免万一的情况发生,我们总是不懈努力,这就是CComVariant出现的动机吧(个人诳语丷丷)。  哈哈,其实CComVariant的出现应该从VARIANT的不足谈起(也就是所谓的使用VARI

2008-06-09 23:35:00 4279

原创 CString常用操作种种

  CString给MFC程序员带来了在那个年代不敢奢望的功能,甚至在VS2005刚发布的时候,为了应对默认UNICODE的问题,我常常使用CString避免显式的宽字符转换。  在现在,好用的CString也是ATL的一部分了。其实ATL里的CString和MFC里的是同一个东东,如果在MFC中已经很熟悉CString了,就没有必要更多的研究了。  下面是我自己觉得常用的几个操作,当然有

2008-06-09 22:17:00 5864

原创 CComBSTR操作种种

  CComBSTR是封装了BSTR的一个类。 /* class CComBSTR { public: BSTR m_str; } */  CComBSTR提供了A构造函数、B赋值操作、C获得内部BSTR方法、D连接、E大小写转换操作、F比较操作、G永久性操作等。  CComBSTR提供了8个构造函数、3个赋值操作方法、4个和内部BSTR有关的方法、9个连接方

2008-06-09 19:44:00 8465

原创 模板高级编程

模板提供了神奇的功能: template  T min(const T& a,const T& b);这是很基本的东西,我这里说的高级编程是三个高级用法,这都来自Loki或ATL的提醒,我只是简单总结了一下我的理解。1.隐藏参数细节模板代码和使用代码一般是这样的:template class MyClass{public:};MyClass mc;为了让终端用户使用的时

2008-06-06 22:24:00 895

原创 DCom跨机器调用

终于调用成功了。不过这个成功来的好晚。一周前我就在折腾这个问题,当时碰到问题在网上查了很多资料,甚至把dcomcnfg里自己觉得可能影响调用的安全认证全关了,还是不行,因当时有事忙别的,今天想起来这事继续较劲,终于成功了。之前不成功有两点: COSERVERINFO serInfo; serInfo.dwReserved1 = 0; serInfo.dwReserved2 = 0; s

2008-06-05 17:25:00 1163

转载 复合文件函数

  关于com如何,我不说废话,个人观点,com思想值得深入。  复合文件的方案是砸在com头上的苹果,但是个人观点,IStorage、IStream都是com接口,实际使用意义更大。宛如操作非结构化文件的时候只在使用若干api不用太了解底层的东西一样。所以简单列出几个常用方法,实际用的话去msdn吧。

2008-06-04 22:25:00 1045

原创 从com看代码的重用级别

1.C++类库的重用使用方式.h + lib一旦被编译进项目,该模块不再有类库的概念,它已经是项目的一部分了。在运行时,他不载入内存,有很多模块使用它,就有很多个拷贝存在内存中。当类库被patch后,没办法刷新已发布的项目。2.dll级别使用方式.h + lib + dll其实,dll样式的重用已经不错了,而且使用def文件可以保证导出函数的一致性。但是,我们无法处理异常等编译器相关的东西。但是,

2008-05-30 10:39:00 695

原创 游戏引擎骨骼图(科普文)

  在sdl的一篇引擎示例文上发现了这个,很骨骼地概括了引擎的作用:循环处理输入、逻辑、绘制。  当然,一个可以使用的引擎需要很多功能上的支持,但是不要只见树木不见森林。

2008-05-20 15:49:00 860

原创 捐了1千

上班时间很少上网,我觉得那很浪费工作时间。但是这两天却一直在刷新关于汶川的消息,我本就是一个很容易哭的人,每次看到救援的新进展我都眼眶热热的。生命如此的脆弱,我发现自己那么的无法坚强。人家在前线救人,我做不了什么,尽点绵薄之力,为灾区人民祈福。愿天佑我中华。

2008-05-14 14:50:00 1345

原创 error C2683: “dynamic_cast”:“XXX”不是多态类型

是的是的,使用dynamic_cast会引发效率上的担忧,但是有时候这是必要的,而有时候,这是必须的,在自己不预加运行时识别策略的时候,如果要使用运行时处理机制,通过dynamic_cast判断指针或检测异常是一个非常直观的想法,而且不少时候这也很有效。但对dynamic_cast理解不够深入会遇到这样的麻烦:class Bast...{};class Test    :public 

2008-04-21 15:39:00 7779 4

原创 聆听大师的声音(EFC)

1.使用const和inline而不是#definedefine可以做成全局的,static const做成全局的则有欠面向对象。define需要一致的使用方式,否则和散落在各处的static const一样难以修改(和魔术数字遇到同样的问题)建议define单放在一个文件中并且使用严格编码规范保证按照设计思路使用。const面向对象的做法是封装成class中的static成员变量,但这样需要额外

2008-04-16 17:44:00 1030

原创 winsock select的限制和非常规用法

1.winsock select最多处理64个socket限制    第108行进行了如下定义:#ifndef FD_SETSIZE#define FD_SETSIZE      64#endif /* FD_SETSIZE */意思非常明显,也就是说winsock最多处理64个sock,其实这很好理解,select是用位操作(linux下sys/socket部分代码我也没找到

2008-02-12 01:51:00 2265

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除