![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技术
文章平均质量分 62
BalonFan
做人如果没梦想,那跟咸鱼有什么分别?
展开
-
“显示名称”只能用于“显示”
ight:450px;width:100%;"> 有很多函数返回被称为“显示名称(display names)”的字符串。对于这些显示名称你可以做的唯一一件事就是拿来显示。不要假设这些字符串有任何实际的意义,因为它们的确没有意义。理论上,一个类似于SHGetFileInfo这样的函数可以被实现成: ... if (uFlags & SHGFI_DISPLAYNAME)翻译 2007-03-14 14:21:00 · 2151 阅读 · 0 评论 -
在Windows下编译 Boost 1.35、Lua 5.1和LuaBind 0.7
编译boost工具bjam:1. 使用Visual Studio 2005 Command Prompt环境运行/tools/jam/src/build.bat2. 生成的目标文件在/tools/jam/src/bin.ntx86/bjam.exe编译boost 1.35:1. 将bjam.exe拷贝到目录2. 编译多线程dll、Debu原创 2008-07-30 12:24:00 · 2845 阅读 · 0 评论 -
依赖注入(Dependency Injection)
1 A code illustration using Java 1 Java代码示例2 Forms of Dependency Injection 2 依赖注入的几种形式3 Existing frameworks 3 现有框架4 See also 4 参见5 External links 5 外部链接Type 1 or int翻译 2008-09-30 20:35:00 · 2902 阅读 · 0 评论 -
C++中实现静态初始化代码段
C++中,我们经常会用到静态变量,但对于这些静态变量的初始化,我们只能对其进行赋初值,不能像C#或是Java中那样,有一个静态初始化段来进行一些复杂的初始化工作。 举例来说,我有一个类,其成员变量会在多个线程中并发访问,所以我需要一个锁来保护数据一致性。于是有了这样的代码: class MyClass { public: void原创 2008-09-30 20:40:00 · 6405 阅读 · 0 评论 -
小心Windows消息的限制
Windows提供的消息机制实在是一个好东西:1. 消息队列是Per-Thread的,向一个消息队列投递消息,只有此消息队列对应的线程可以进行处理。2. 消息队列是线程安全的,并发的访问会进行序列化。3. 窗口有线程关联的,向窗口投递消息,将投递到创建这个窗口的线程对应的消息队列。4. Windows为那些将窗口用作线程间数据传递的应原创 2009-03-22 23:07:00 · 2228 阅读 · 2 评论 -
运行期显示多态指针的类型名
使用C++的RTTI,可以在运行期显示多态指针的类型名 typeid(p).name()是多态指针的当前类型typeid(*p).name()是多态指针的most derived类型 后面这个特性在Observer模式中查错时特别有用:有时候一个observer注册到subject后,在自己实例被销毁前忘记反注册,就会在后面subject通知时,引发对无效指针的操作,而这时原创 2009-04-24 20:43:00 · 1099 阅读 · 0 评论 -
ATL字符串转码的陷阱
在代码中经常使用UTF8与Wide Char的转换,每次手工调用WideCharToMultiByte转换很是麻烦,于是参考ATL的W2A、A2W这样的宏,自己写了两个宏:UTF82W、W2UTF8。我写的UTF82W、W2UTF8与ATL的W2A、A2W一样,都是使用_alloca在栈上开辟临时空间存放转换结果的。后来,由于在使用中出现了一个函数中转换的次数过多导致栈溢出的问题。于是想改进这原创 2009-04-24 20:54:00 · 4043 阅读 · 0 评论 -
条件断点引发的血案
今天在调试打条件断点时,想起一出调试往事。同样也是条件断点,难倒了我们这所有程序员。为了以后总能记得这事,把这事写到偶博客里。 当时我们服务器的光哥在Linux下用gdb调试一段代码,发现执行到一个地方时有一个变量的值是一个与预期不符的值,于是顺手打了一个条件断点:当执行到这一行,这个变量的值为那个有问题的值时就断下来,以确定是什么情况下出问题。 结果,问题就来了… 跑过几原创 2009-05-05 10:49:00 · 1381 阅读 · 2 评论 -
鼠标光标的一个“看起来”很神奇的问题
Windows里最让人抓狂的问题,莫过于鼠标相关的BUG了(估计所有GUI程序都一样)。鼠标的BUG往往还不能直接打断点调试,只能结合日志信息,加上自己的经验一起来查,这就更是难上加难了。 最近遇到一个问题,虽然很快解决了,但解决过程自觉还是很典型的。 问题是这样的:我们的程序主窗口上有一些区域鼠标移上要变手形光标,移开恢复箭头光标。原来一直是正常的,但一个新版本开发了一周后合出来原创 2009-05-07 16:33:00 · 2060 阅读 · 0 评论 -
今天这个BUG再次证明了,凡事有果必有因
我们的程序用到Flash控件进行互操作以提供更友好的界面。为了屏蔽右键菜单,直接子类化了Flash窗口,用自己的窗口函数,在右键时不发送给Flash控件,自己处理。测试中发现,一些情况下(主要是点击后开IE),关闭窗口销毁控件会导致崩溃。 1. 发现在ShellExecute这个API中会有消息循环,导致WM_CLOSE会在ShellExecute返回之前被处理2. 改成异步S原创 2009-05-22 01:37:00 · 1566 阅读 · 0 评论 -
GDI+中创建离屏缓冲位图的性能问题
在GDI+中,使用Bitmap创建一个离屏缓冲,必须要使用以下构造函数版本:Bitmap::Bitmap(INT width, INT height, Graphics* target)而不要使用以下构造函数版本:Bitmap::Bitmap(INT width, INT height, PixelFormat format)否则,在调用Graphics::DrawImage原创 2009-08-23 17:06:00 · 1608 阅读 · 0 评论 -
DayDayUp - CUDA、GPGPU,GPU通用计算技术
利用GPU的大量并行计算单元进行并行计算,辅助CPU进行计算密集任务 CUDA英文首页http://www.nvidia.com/object/cuda_home.html CUDA中文首页http://cuda.csdn.net/ GPGPU相关http://en.wikipedia.org/wiki/GPGPU 新版Adobe C原创 2008-07-09 18:12:00 · 1265 阅读 · 0 评论 -
Balon白话MSDN:从普通DLL中导出C++类(1) – dllexport和dllimport的使用方法(中英对照、附注解)
Balon白话MSDN:从普通DLL中导出C++类(1) – dllexport和dllimport的使用方法(中英对照、附注解)这几天写几个小程序练手,在准备将一个类导出时,发现还真不知道如果不用MFC的扩展DLL,是怎么导出的。但我知道dllexport可以导出函数和变量,而且MFC扩展DLL就算是使用了MFC的功能,但能否导出类应该也不是必须用MFC才能够做到,一定是有相应的机制可原创 2007-05-09 20:46:00 · 8738 阅读 · 0 评论 -
Balon白话MSDN:从普通DLL中导出C++类(2) – 细看导出C++类的底层机制
Balon白话MSDN:从普通DLL中导出C++类(2) – 细看导出C++类的底层机制上一篇文章中,我们介绍了怎么从一个DLL中导出C++类,及选择性导出C++类的成员的方法。那么,整个系统的底层机制是怎么样的?是通过什么途径,使得我们可以在另一个程序中使用一个DLL中导出的类的呢?我们知道,要使用一个C++类,必要的条件是在编译期能得到这个类的头文件,并在链接期可以找到对应的符号原创 2007-05-10 23:56:00 · 7732 阅读 · 2 评论 -
不要要求你的所有用户都具有哲学学位,系列1
帮助文档不是设置逻辑迷题的地方。 在Windows Vista系统中,当进入系统控制面板,你会看到一个描述你电脑等级的数字。但问题是数字是越大最好,还是恰恰相反?如果我需要选择一台电脑,等级1和等级5的哪个好呢?在早期beta版的Windows Vista中,你需要有哲学学位才能区别出这个。如果你在系统控制面板中点击“帮助”按钮,会来到一个试图解释性能等级的帮助页面。当它开始解释数字含义时翻译 2007-03-15 15:16:00 · 1540 阅读 · 0 评论 -
增强的C/C++字符串格式化函数
http://www.codeproject.com/useritems/FormatString.asp一个设计用于取代C/C++中sprintf函数族的函数,参考了.NET中的String.Format函数,加强了对溢出的保护,并增加了对国际化的考虑,包括语序和时间表示等。考虑的很全面原创 2007-03-13 19:31:00 · 2714 阅读 · 1 评论 -
计划翻译The Old New Thing上的LockWindowUpdate系列文章
计划翻译The Old New Thing上的LockWindowUpdate系列文章,这系列文章对LockWindowUpdate函数进行了深入剖析,给大家展现了LockWindowUpdate平时被人忽视的一面,并说明了这个函数的典型误用已经翻译的文章:LockWindowUpdate系列1:LockWindowUpdate的行为?LockWindowUpdate系列2原创 2007-03-19 10:59:00 · 1471 阅读 · 0 评论 -
不要要求你的所有用户都具有哲学学位,系列2
前面我们了解了“帮助文档不是设置逻辑迷题的地方”。对话框也是一样。 我偶然遇到过一个设置对话框,上面有这么一项:关闭功能X这么一个否定意义的复选框,将你的对话框变成了一个逻辑迷题。复选框应当用肯定语气表达:使用功能X(对于“不使用否定复选框”规则的唯一例外是“不再显示这条信息”复选框。)否定意义复选框会变成一个迷惑用户的游戏。“如果我不勾选‘关闭功能X’,那么我不会不运行这翻译 2007-03-16 00:14:00 · 1378 阅读 · 0 评论 -
LockWindowUpdate系列2:LockWindowUpdate是打算如何使用的?
现在我们知道了LockWindowUpdate的行为。现在我们来看一下它是用于做什么的。 事实上,LockWindowUpdate的设计意图可以用一个词表达:拖拽。但我们稍后再说到这个。 LockWindowUpdate的目的是允许一个程序暂时的接管绘制窗口的工作。为了做到这个,你当然需要防止窗口函数(或其它任何人)进行他们正常的绘制活动;否则,两处的代码(正常绘制窗口的代码翻译 2007-05-04 00:04:00 · 4598 阅读 · 0 评论 -
LockWindowUpdate系列3:什么样的操作中应当使用LockWindowUpdate?
如我在前面所说的,LockWindowUpdate的设计意图可以用一个词表达:拖拽。LockWindowUpdate最简单的使用场景是在“拖动时显示窗口内容”功能关闭的情况下,当你移动或是改变窗口尺寸时,被窗口管理器使用。当你开始移动/改变尺寸操作,窗口管理器锁定整个桌面以便可以绘制细点矩形反馈,而不会因为其它窗口偶然与细点矩形交叠而导致冲突的风险。当移动/改变尺寸的操作完成,桌面被解锁翻译 2007-05-04 21:16:00 · 3906 阅读 · 0 评论 -
LockWindowUpdate系列5:关于LockWindowUpdate的最终评论
现在大家了解了LockWindowUpdate的设计意图,我现在将要告诉大家你们为什么不应当使用这个函数,甚至不是因为其设计意图的缘因。 这需要回到LockWindowUpdate被创造出来的历史环境。回到16位Windows(特别是Windows 3.1)的时代。在那时,内存还是很昂贵的,显示驱动功能也很有限。还没有DirectX,没有AlphaBlend函数。你所拥有的一切就是一翻译 2007-05-05 14:07:00 · 4152 阅读 · 0 评论 -
LockWindowUpdate系列4:什么样的操作中不应当使用LockWindowUpdate?
那么,现在我们已经知道了什么样的操作中应当使用LockWindowUpdate,现在我们来看一下人们在一些与拖拽无关的工作中错误使用这个函数的方式。 人们看到LockWindowUpdate“锁定的窗口将不能绘制自己”的行为,就用它来作为WM_SETREDRAW消息的偷懒的使用方式,尽管发送一个WM_SETREDRAW消息不不比调用LockWindowUpdate更麻烦。只是多打20翻译 2007-05-05 01:45:00 · 4092 阅读 · 0 评论 -
分久必合 - Vista、Visual Studio Orcas、SilverLight、Expression Studio、WPF、XAML 给我们带来的开发趋势
最近工作之余留出了点时间,关注了一下近来出现的新技术(有些可能已经不算新技术了,只是我很久没看,暂且以为是了)。微软看的比较多,其它的也看了一些。 首先是Visual Studio.NET Codename “Orcas” Beta1发布。在我们还在考虑到底是不是应当一步到位的从VC6切换到VS2005时,微软已经在Visual Studio上跑的很远了。新的Orcas几乎在开发原创 2007-05-05 19:20:00 · 4526 阅读 · 1 评论 -
正确的在遍历过程中使用STL容器的erase函数
以前使用VC6开发,最近换用VS2005编译以前的程序,在运行时出现断言,切回 调试器,发现提示是"vector iterators incompatible”发现引发这个错误的代码如下: VectorType::iterator it = someVector.begin();for (; it != someVector.end();){ if (*it== valu原创 2007-05-01 00:54:00 · 2903 阅读 · 0 评论 -
LockWindowUpdate系列1:LockWindowUpdate的行为?
对LockWindowUpdate可怜的误解。 这是关于LockWindowUpdate系列的第一篇。LockWindowUpdate的行为,它是用于做什么的,以及(可能更重要的是)它不是用于做什么。 LockWindowUpdate做的事情其实很简单。当一个窗口被“锁定”,所有向它及其子窗口的绘制都会失败。取代绘制操作的是,窗口管理器记住了应用程序试图在窗口的哪一部分中进行翻译 2007-05-01 23:34:00 · 8391 阅读 · 0 评论 -
《领域驱动设计》看完留念
花了两三周,每天10点半到家后,花上两小时看上一部分,这周3终于看完了。这本书比《对象设计》结构整齐一些,更容易跟上作者的思路。前面部分写了领域驱动设计的一些基础方面,包括如何交流,如何调整结构,哪些是领域构造块等等。后面用部分开始跳出细节,从一个很高的视角看待前面的所有内容在整个体系中的位置及作用,并把前面的内容放在一起来演示了大比例结构上的应用。看完后,突然觉得,其实一些方法论,在不同原创 2009-07-11 15:48:00 · 866 阅读 · 0 评论