首页

轶事一则:一位客户的反馈

一个命令行选项引发的故事 下面截取自一位客户在使用Windows 95时的使用反馈,这件事已经过去很多年了,但我依然印象深刻,难以忘怀。 <<<<<<<<<<<<<<<<<<<<< ID: 13726 时间:1996-07-29 17:27:41.997 姓名:<隐去...

说说上古时代的主线程模式

史上(可能)让你最疑惑的词:marshal 在COM世界,曾经有着一个颇为神秘的东西:主线程模型(main threading model)。 它主要用在显式COM线程模型还没有发明的时期,可以说,主线程模型是多线程正式来临之前的那一段时期的特殊产物。 进程的第一个线程会初始化COM库并被称之为”主”线程。(可能它是在套件模型中第一个初始化COM库的线程,我不太记得了。) ...

桌面外壳API之小技巧一枚

标志位SHGFI_USEFILEATTRIBUTES的用法 对于Windows桌面外壳API SHGetFileInfo来说,你可以向它传递一个特殊的标志位SHGFI_USEFILEATTRIBUTES。那么,这个标志位是什么意思呢? Well,它的意思是告诉Windows外壳:请不要访问磁盘,并且假装我指定的文件/文件夹存在,并且文件/文件夹的属性是我传递给你的dwFileAttributes参...

最小化所有窗口和显示桌面的区别

一个小问题 “最小化所有窗口”的键盘快捷方式是Win + M,”显示桌面”的键盘快捷方式是Win + D。这两种操作,看起来好像都差不多,那它们实际上有什么不同呢? “最小化所有窗口”,从字面上很容易理解。它将所有支持”最小化”操作的窗口全部最小化。你可以通过从”系统”菜单中选择...

人们不会注意一个程序的内部变化

程序的内部变化和外部变化 有些人会经常向我抱怨:为什么这么多年过去了,计算器和记事本这两个小工具一点变化都没有? 实际上,它们确实改变了,只是你没有注意到而已。 如果你观察下你的记事本程序,你会发现它多了一些额外的菜单。 还有计算器这个程序也经历过很多次”大修”。 对于下面的用户反馈,我通常不会感到意外: “微软为什么要花很多时间使Windows操作看起来很酷?...

第二部分:关于析构函数何时执行  

让我们继续昨天的”故事” 下面是另外你必须小心留意析构函数执行顺序的例子。昨天的例子是讲述对象的析构函数在错误的时间点执行。今天,我们的主题是:对象析构函数压根就不会执行,这可不是你预先想到的情况,对吧? 假设,我们有一个ObjectLock类,它会在构造函数中获取锁对象,然后在其析构函数中释放它。如下图所示: 再一次地,上面的代码都是标准套路,看起来没有什么大的问题。代...

第一部分:关于析构函数何时执行  

C++: 一座看不见的冰山 Larry Osterman在他的博客中讨论全局对象析构函数执行时的细节,我想说的是,其实不仅是全局对象,对于局部对象来说,它的析构函数的执行时间点也十分重要,你需要谨慎地处理,方能确保安全。我们先考虑下面的代码: 代码看起来再简单不过了,但是请注意,上述代码蕴含Bug一枚。 问题:智能指针的析构函数何时运行? 答案:如果对象超出作用域,也就是在执行到最外层的if语句...

请提防哈希重置攻击

使用哈希值判断内容变更 真实世界中存在很多种不同的哈希算法,例如我们比较熟悉的MD5。这些算法的共同点是,它们会接收一份原文消息,然后产生一组基于消息原文的哈希值(散列),即使原文发生任何一丁点变化,则会引发哈希值的巨大变化,这样你就可以很容易地判断文件的哈希值来知道一个文件是否发生了变化,这种功能的实现是基于这样一个事实:现实中很难在不修改哈希值的情况下,实现对一个文件的修改。 但是 看起来这个...

界面设计一二事

一个问题 有时候,我们会在Windows桌面应用的菜单或者按钮的文字后面,看到三个点”…”,这个是什么意思? 举个例子 在一个桌面程序的菜单中有个”另存为…”,或者有个按钮显示为”自定义…”。这些用户控件文字后面的三个点在什么情况下会出现呢? 很多人会说:如果应用即将显示一个对话框,就会使用...

如何理解文件共享选项(例如FILE_SHARE_READ)

实际上它并不复杂,至少比你想象的要简单。 FILE_SHARE_READ 这个文件共享选项的意思是:当我已经打开了一个文件后,其他人依然可以读取这个文件。 如果你不使用这个选项,则你是在表达这个意思:当我打开一个文件后,我不希望其他任何人读取这个文件。 明白了上面的讲解,接下来的工作就交给操作系统处理就可以了。 假设,你忽略了这个选项,那么就在表明:文件打开后,你不希望其他人能读取这个文件。这样的...