自定义博客皮肤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

山高月小 水落石出

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

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

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

2008-06-19 00:16:00 1701

原创 winsock缓冲的拆分包问题

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

2008-06-18 23:39:00 1137

原创 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 746

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

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

2008-06-18 15:01:00 1055

原创 完成端口cookbook

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

2008-06-18 14:26:00 1155

原创 GetQueuedCompletionStatus一直阻塞

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

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

原创 闲侃完成端口

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

2008-06-18 00:37:00 1012

转载 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 1096

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

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

2008-06-13 18:20:00 1769

原创 通过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 6465 4

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

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

2008-06-13 09:06:00 1276

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

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

2008-06-13 08:51:00 1394 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 3285 1

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

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

2008-06-12 23:27:00 1716

原创 _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 4171

原创 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 6064

原创 __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 4731

原创 CAutoPtr和CAutoVectorPtr

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

2008-06-10 13:27:00 3112

原创 CComPtr和CComQIPtr

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

2008-06-10 12:20:00 3779

原创 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 3183

原创 CComVariant相关

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

2008-06-09 23:35:00 4335

原创 CString常用操作种种

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

2008-06-09 22:17:00 5909

原创 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 8521

原创 模板高级编程

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

2008-06-06 22:24:00 907

原创 DCom跨机器调用

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

2008-06-05 17:25:00 1181

转载 复合文件函数

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

2008-06-04 22:25:00 1056

空空如也

空空如也

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

TA关注的人

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