首页

小技巧:使用对象机制实现组件初始化及销毁  

问题 最近在对一份代码进行重构的时候,发现在特殊情况下,组件的销毁接口会因为程序的异常而得不到调用,这个虽然不是什么大问题(整个程序都出现异常了,进程退出是即将发生的事情),但是对于有点完美主义的我来说,这个的的确确的,降低了程序的异常安全性。 解决方法 我们先来看下面一张图,它描述了程序改造之前的交互场景: 在上图中,我们在CWinApp对象的InitInstance中调用了组件的Init接口...
  • 阅读全文 |
  • 分类:小技巧 |
  • 发表于:06月08日 |
  • 浏览:3303 |
  • 评论已关闭 条评论

实战经验:WM_COPYDATA在不同权限进程中的接收问题

问题 在一次开发中,需要使用到WM_COPYDATA方式来实现两个进程之间的数据传输。在网络上可以找到很多关于WM_COPYDATA的示例代码,而且代码结构也比较简单易懂,所以WM_COPYDATA的示例代码不是今天要详细讨论的内容。 今天的问题存在于两个不同权限的进程,例如发送端进程运行在普通用户账户下,而接收端进程则运行在管理员账户下。在这种情况下,发送端发送的WM_COPYDATA消息,将不...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:05月25日 |
  • 浏览:1115 |
  • 评论已关闭 条评论

实战经验:给应用程序添加代码签名  

问题 在一次开发过程中,碰到了这样一个问题:应用程序在VS2010中已经启用了”需要管理员权限”,但是当UAC提示框出现时,应用程序因为Windows安全机制的限制,无法访问UAC,也即应用程序无法使用SendInput来模拟鼠标和键盘操作。经过一番研究,发现应用程序需要做如下的配置,才能实现UAC界面的访问: 1) 强制应用程序以管理员权限启动,这个可以在VS2010中设...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:05月14日 |
  • 浏览:1638 |
  • 评论已关闭 条评论

实战经验:使用CFileDialog实现多个文件选择  

问题 最近需要实现文件选择的功能,要求是需要弹出系统标准的文件选择对话框,另外,允许用户选择多个文件。 解决方法 MFC中有一个类CFileDialog就是用来做这件事的,而且功能还挺丰富,今天只是使用它的一小部分特性。 直接上代码 以下代码实现了一个方法,该方法弹出文件选择对话框,允许用户选择多个文件,让点击确定时,以列表的形式,返回用户选择的所有文件。 vector<CString&...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:04月28日 |
  • 浏览:1711 |
  • 评论已关闭 条评论

实战经验:CRichEditCtrl插入图片(不止是位图)

问题 在一次功能开发中,我希望可以在CRichEditCtrl控件中插入一些图片,这些图片可能是位图(bmp),也可能是其他格式(jpg, png等)。   以下是一种思路 1) 图片文件可以通过GDI+中的Bitmap类来加载。 2) 如果要插入图片到CRichEditCtrl,则需要涉及到OLE对象的插入。可以这样理解,每一个图片文件都是一个OLE对象,这些OLE对象通过CRichE...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:04月21日 |
  • 浏览:1612 |
  • 评论已关闭 条评论

实战经验:通过WMI获取硬件序列号

如何标识一台机器 在开发中,有时候我们需要获取唯一标识本机的序列号,你可能会想到如下几种 1) MAC地址 2) CPU ID 3) 硬盘ID MAC地址 因为MAC地址可能会被修改,而且本机可能会有多张网卡,同时网卡的数量会随着网卡被启用或禁用而发生变化,所以暂时就不考虑使用MAC地址作为本机硬件标识了。 CPU ID 这个看起来不错,但是有个问题:CPU厂商有时候为了规避隐私问题,会对同一批次...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:03月31日 |
  • 浏览:1766 |
  • 评论已关闭 条评论

深度理解:WM_UPDATEUISTATE和WM_CHANGEUISTATE  

今天我们来聊一聊Windows里比较少用到的两个消息: WM_UPDATEUISTATE和WM_CHANGEUISTATE。 写这篇文章的原因,也是因为在开发中碰到一个界面绘制的问题,后来发现这个问题和这两个消息有关,当然了,这个问题在这里就不详细展开了,我可能会在另一篇文章里再写。 在讲述这两个消息之前,我先介绍一个概念:keyboard cues。我就先将它翻译成”键盘指示器...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:03月17日 |
  • 浏览:1814 |
  • 评论已关闭 条评论

实战经验:ON_CONTROL_REFLECT(_EX)的在CEdit扩展中的使用

MFC提供了编辑框控件CEdit,可以基本满足我们的一般性编辑需求,但是如果想对CEdit进行定制,例如重新设计其边框,对用户输入做预处理的时候,我们需要扩展CEdit。今天来看看ON_CONTROL_REFLECT和ON_CONTROL_REFLECT_EX这两个反射宏在CEdit扩展中的使用。 ON_CONTROL_REFLECT 从名称上来看,ON_CONTROL_REFLECT是一个反射宏...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:03月10日 |
  • 浏览:2070 |
  • 评论已关闭 条评论

实战经验:采用MFC的CArchive将对象序列化到CMemFile中

在一次编程实验中,我碰到了这样一个问题:我需要将一个对象通过网络传输出去。 首先为了可扩展性,这个对象被设计为变长结构,也即我们事先不能知道它确切的长度。有些朋友会说,可以创建一个足够大的缓冲区来承载这个对象。嗯!当然是可以的。但是这样的设计不是最优的,因为网络带宽是有限的,从节省带宽的角度来说,使用大缓冲区肯定意味着有些不必要的数据和有效数据一起传输。另外,对象长度变长,缓冲区的最大尺寸,还真是...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:02月24日 |
  • 浏览:1884 |
  • 评论已关闭 条评论

代码片段:CFormView手动创建以及OnInitialUpdate

CFormView相比CDialog来说,多了个比较吸引人的优点:它继承自CScrollView。因此,天然的,CFormView就拥有了视图自动滚动的特性。 动态创建 继承自CFormView的子类,VS的代码生成器会自动使用如下的两个宏: DECLARE_DYNCREATE(子类的头文件) IMPLEMENT_DYNCREATE(子类的实现文件) 这两个宏经过展开后的即可使类具备动态创建的特性...
  • 阅读全文 |
  • 分类:技术 |
  • 发表于:11月12日 |
  • 浏览:2180 |
  • 评论已关闭 条评论