摘要:
同学们动态加载dll的时候是不是感觉挺麻烦的,每次都::LoadLibrary,::GetProcAddress,还要typedef一堆函数。最近闲来无聊,用宏封装了一下,可以少写不少代码,用来也挺方便的。不过最多支持5个参数,同学们可以自己加。等着下次用flexbison写一个生成工具,我感觉还是... 阅读全文
摘要:
很早的时候公司里开发了个c++客户端软件,需要支持windows2000,要求简单小巧,并且不希望引入其他界面库,图形引擎之类的东西,像gdi+之类的,于是对于美工做出来的一些界面,需要有alpha通道的图片渲染很麻烦,自己写的效率还有些低.于是从msdn找到了alphablend这个函数,来做图像的alpha混合,刚开始的时候,以为这个函数只能够处理整个图片的整体透明度,不能处理32位图像每个像素的透明度,后来仔细研究,发现是可以做到的,配置如下参数: BLENDFUNCTION _blendfunction = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA ... 阅读全文
摘要:
在做研究之前先简单说一下之前公司的通讯模块。最早的时候公司开发的web管理系统是需要配合c++桌面客户端进行一些系统底层操作,并非普通的b/s架构,或者c/s架构,因为需求是可以通过web管理系统向客户端发送一些简单的指令和策略,客户端根据不同只指令或策略进行系统底层的一些操作,并可以向服务器提交日志及状态信息. 依此我们设计了如下架构: 其中web服务器是用c#写的,通讯服务器是用c++写的,客户端使用c++写的,管理员通过web登录到web服务器管理界面,将相关策略发送到通讯服务器,再由通讯服务器通知到c++客户端,为了保证能够即时得到通知,使用通讯服务器与客户端之间建立tcp... 阅读全文
摘要:
之前由于一直在做客户端开发,对分布式内存缓冲数据存储的原理一直都存有很多疑问,想着无非是哈希算法,或者分级的数据查询,但这两种方式都有很多缺点,使用哈希算法扩展起来很麻烦,分级的话会造成最上级节点瘫痪,导致所有数据请求无法查询。 最近的新工作需要做一些大数据处理,也了解了一些memcache,HazelCast之类一些缓存系统,从网上搜了一些实现原理的资料,发现其核心是一种叫做一致性哈希的算法,不过我觉得叫“连续hash算法”更合适点,这篇文章上有些详细的介绍http://blog.csdn.net/sparkliang/article/details/5279393。 C语言版本的算... 阅读全文
摘要:
备忘一下,今天写程序的时候用了一个自己写的基于引用计数的智能指针,结果发生了内存泄漏,奇怪了半天,最终找出了问题所在。大概是这个样子: ref_ptr<View> main_view_ptr = make_ref_ptr( new View);main_view_ptr->Connect(..., main_view_ptr);其中main_view_ptr又作为上下文传入参数保存到了main_view_ptr的成员变量中,结果造成了自己保存了自己的指针,造成main_view_ptr超出作用域的时候无法析构,引用技术一直为2.这样就给我提了个醒,即使使用了智能指针,也不要传 阅读全文
摘要:
可以聚合的com需要在内部实现一个代理INondelegatingUnknown接口,并在类厂创建第一个接口的时候,检查 // iid must be IID_IUnknown for aggregating if ( ( pUnknownOuter != NULL ) && ( iid != IID_IUnknown ) ) { return CLASS_E_NOA... 阅读全文
摘要:
之前我们实验的是在多个线程中创建不同的套间,并且在每个线程中都分别创建单独的com对象。这次实验的是在一个线程中创建对象,然后将对象传递到另外一个线程,再进行调用。我们知道com中是不允许直接把接口指针从一个线程从直接传递到另外一个线程的,当需要传递的时候需要先从当前线程对接口对象进行列集,并且在另外一个接受的线程进行散集,使用散集后的接口指针调用对象提供的方法。下面直接看代码:先实验APARTM... 阅读全文
摘要:
通过第一篇文章的实验我们的出了如下的结论:1.如果com组件的线程模型与所处的套间模型不匹配的话,com库将会自动另外开启一个线程,并初始化为与之匹配的线程套间,并在此套间中创建COM对象。比如在单线程套间中创建Free线程模型的com组件或者在多线程套间中调用single或者apartment类型的com组建都会单独创建一个线程来创建组件。因为一个线程只能拥有一种类型的套间。并且我们发现如果多个... 阅读全文
摘要:
GDT和LDT分别为全局描述表和局部描述表,其中表中每一项又叫做段描述符。段描述符,由段地址,以及段类型,特权级DPL等组成,其中段类型说明此段是代码段还是数据段,还是各种门,还是TSS等。通过GDT访问某个段的时候需要使用段选择符来进行调用。普通调用下,是根据是否是一致代码段进行同级权限代码段之间的调用,或者是低权限向高权限代码的调用,但是CPL不会改变。如果想要从低权限向高权限调用,并且可以改... 阅读全文
摘要:
创建一个对话框应用程序进行测试主线程代码CoInitialize( NULL);{ CString str; str.Format(L"threadid:%d ,msg:%d", GetCurrentThreadId(), GetCurrentThreadId()); MessageBox( str, str, MB_OK); ITestShowMsgPtr ptrMsg; HRESULT hr... 阅读全文