摘要:ATL3.0编写的组件在注册时,如果组件所在目录包含中文路径,不能在注册表生产正确的路径,从而产生虽然注册成功,却不能使用的问题,因为在注册表记录的DLL路径中文部分有乱码。这个问题很久以前就发现,一直没有解决。前段时间在网上搜索到解决方案,并转载在blog上,却一直没有实际试用。今天企图使用,却发现不成功,昏倒,试了几次都不行。看来网上的代码还是不能轻信。不知道文章的作者有没有实际调试成功,不过...
阅读全文
摘要:以前VC6的代码,从xml文件中读取属性文字(中文),返回BSTR类型,用OLE2T转换,然后显示,一直工作很正常,用来做本地化,比修改Res文件要方便的多。同样的代码,在VS2003里面居然不能工作了,调试,发现BSTR返回正常,而通过OLE2T转换居然就全转成“???”了,晕。做了无数尝试,发现用unicode编译就正常。可是原来的VC6项目不论是否Unicode编译都...
阅读全文
摘要:起因上次完成了CAppBar的代码后,就一直想在标题栏的关闭按钮前面加一个按钮,来控制自动隐藏的设置。在标题栏上加按钮并不算特别麻烦,主要是控制WM_NCPAINT,把想要的效果画上去。当然,原理不复杂,要实现的好却不容易。上网搜了一下,有一些简单的例子用来讲述原理,没有找到比较好的实现,更谈不上可复用的代码了,那么只好自己实现了。原理首选必须明白原理,想在标题栏上创建CButton这样窗口按钮的...
阅读全文
摘要:关于Docking Window的文章有很多,基本都是讲主程序内部的工具栏小窗口的Docking,看看代码,一般都很复杂。关于桌面Docking的文章并不多见。实际上从Windows95开始,Win32 API就提供了一个叫做SHAppBarMessage的函数,用于实现完全等同于Windows Task Bar的功能。即可以停靠在屏幕在任意一边,并把自己排除到桌面空间之外。当其他应用程序窗口最大...
阅读全文
摘要:ATL组件注册的一个很糟糕的BUG,以至于需要通过修改ATL源码来解决。记录在此,方便下次重装机器后使用。 我曾用ATL写过一个COM组件(MBCS下编译),如果安装在中文路径下的话,注册就会失败. 为什么会失败? 打开ATL的源文件statreg.h,可以找到函数BOOL AddString(LPCOLESTR lpsz),他被组件的UpdateRegistry所调用,他又调用了BOOL Add...
阅读全文
摘要:好久没写模板了,这次做一项目,发现一处非常适合使用模板应用,于是写了个模板类,大概类似于酱紫//头文件template<classTElement>classTTTextT{protected:vector<TElement>m_chVector;public:intCount();}//CPP文件#include"TTText.h"template<classTEl...
阅读全文
摘要:上篇讲了COM接口的多线程访问问题,并用全局接口表的方法解决了。但有时候我们不能直接访问接口指针,而是通过一个封装类间接的访问。比如:classSomeClass{private:IMyInterface*m_pInt;public:voidMethod1(){//Initm_pInt}voidMethod2(){//callmethodofm_pInt}}我们只能访问SomeClass的公共方法...
阅读全文
摘要:在多线程程序中使用COM对象真是件令人头疼的事情。当你能够访问一个接口指针的时候,并不意味着你可以调用接口上的方法。我从来没真正搞懂过所谓COM的几种线程模式。问题是,当我试图在一个线程里调用一个COM接口的方法,而这个COM接口是在另一个线程中创建时,从来没有成功过。更糟的是,连错误提示都没有。在多个线程中传递接口需要额外的工作,各种书籍上都介绍了所谓Marshal一个接口方法,不过我从来没有使...
阅读全文
摘要:最近收到一个动态显示隐藏菜单项的需求。通常我们编程时,如果有不同场合需要使用不同的菜单,一般的做法是准备两个菜单资源,然后在需要的时候转载某一个菜单来替代先前的。这样的做法比较简单,但是如果变化很多,需要准备的菜单资源太多,对资源的消耗不能不考虑,所以也会有在代码中动态修改菜单的做法。这里用到的是插入和删除操作。当然所谓显示和隐藏也可以用插入和删除来实现。但是我本来的想法如果能够可以实现显示和隐藏...
阅读全文
摘要:好久没写blog了,没啥好写的今天修改一个以前的项目,是一个利用脚本语言进行二次开发的东东,发现编译有问题,原来是缺少activdbg.h头文件,机器重装过,环境没配置好,还好可以在这里下载到需要的头文件加上就可以了。ActiveScript好像得到的支持非常少,现在都是.net的世界了。可是使用ActiveScript确实可以实现许多非常有意思的东西,例如写一个类似于VB的集成开发环境,通过实现...
阅读全文
摘要:今天收到CodeProject的更新邮件了,文章现在在这里,代码在这里下载。中文支持从这里开始
阅读全文
摘要:有过去一个周末了,昨天去看跳水比赛,现场的气氛还是不错的。可惜田亮没有来,否则,光看看观众席的fans也是一种享受啊。废话结束,进入正题,今天讲点以前没说清楚的内容。上次提到了消息反射,但没有深入,这个概念是这样的,许多窗口控件会向父窗口发送一些消息,比如WM_COMMAND消息和WM_NOTIFY消息,通知父窗口一些事件。因为是发给父窗口的,所以控件窗口的过程函数不能捕捉到这些消息。但是,经常我...
阅读全文
摘要:接上篇,控件类的接口有了:CWidgetHookBase,产生控件对象的工厂也有了,下面就该实现控件类了。在上篇定义控件基类的时候,我们只定义了一个抽象函数Install,而没有任何其他代码,那么,所有的实现代码都交给各个控件类去实现吗?不是的,这些控件类还有许多公共代码可以在基类实现,但是,我们选择不在CWidgetHookBase中加入这些代码,而是再加入一个中间类:CWidgetHook。为...
阅读全文
摘要:今天有点空了,继续写。上次我们已经得出了基本的设计,由此确定了每种窗口必须有一个类来与之对应,这里所说的窗口种类是按照窗口的windows class名称来区分的,class名称相同的就认为是一种窗口。这种分类方法和我们看到的窗口种类可能有一些差异,例如,普通按钮,单选按钮和复选框的类名都是“Button”,对于这种情况,我们仍然用一个类来对应这些窗口,而在类内部区分对待这些不同的窗口。这样,我们...
阅读全文
摘要:上次说了hook和窗口类的原理,有了hook,我们可以截取所有消息,有了窗口类,我们可以识别窗口类型,不同类型的窗口给予不同处理。这样,我们要在钩子函数里面识别不同的窗口和不同的消息,有大量的分派工作,更要命的是,光区分窗口类还不够,同类型的不同窗口经常需要不同的处理,例如两个button窗口,大小不同,文字不同,是否有鼠标按下不同...... 这些状态有些是可以从button窗口读到的,例如大小...
阅读全文
摘要:周末过得很充实,攀岩,游泳,fb今天继续记录Skin技术,CodeProject总算可以上传了,文章在这里,代码可以在这里下载。 原理 上次基本上是些介绍,也就是废话,今天讲讲实现Skin的基本原理吧。要实现自己独特的界面,方法有很多啦,上次也说过,这里只讲一种,就是通过消息钩子改变已有控件的外观。这种方法的好处是可以不必修改程序已经完成的标准界面,只要把钩子函数挂上,所有的界面就都变了,使用起来...
阅读全文
摘要:本来想把代码和E文的文章提交到codeproject再写,不知道为什么,这两天codeproject提交向导一直有问题,也罢,先开始写原理吧,反正恐怕也要写几天的 前言 嘿嘿,估计今天写不了多少,就叫前言吧,下次再写原理说到skin技术,大家都不会陌生,最早接触这东西,可能是winamp吧,可以灵活的更换界面风格,非常的花哨。后来使用skin的软件就越来越多了,毕竟做一个漂亮的界面对软件还是很重要...
阅读全文
摘要:刚才在codeproject折腾了半天,居然提交的时候总出错,郁闷,本来想写完了在这里再写个中文版的。算了,先把英文版的贴在这里吧,回头再说,可惜博客园不能上传代码SkinX Infrastructure
阅读全文
摘要:原理讲完了,下面给点代码吧。根据前面讲的步骤,也不算特别复杂,就是一组API的应用,不过写起来还是比较复杂的,为了方便使用,我总结出一组宏来方便代码编写。当时正热衷于ATL,对宏起到的作用非常崇拜,因此模仿了一下。我知道许多人不喜欢宏,但如果合理应用,还是非常管用的,如有异议,见ATL代码。下面就是完整的宏代码: /////////////////////////////////////////...
阅读全文
摘要:当我们想得到另一个进程空间中的某编辑窗口的文字时,可以首先找到这个窗口的句柄(这个不难),然后向这个窗口发送EM_GETLINE消息,就可以在消息的返回参数中得到那个窗口的标题文字了。很早就有人写了偷取密码的工具,就是利用这个原理实现的。但是,如果想当然的认为可以通过这种方法读取另一个进程窗口的状态,那就错了。当发送EM_GETLINE消息时,LPARAM参数是指向一个字符数组的指针,当SendM...
阅读全文