首页

调试代码可能会成为潜在的安全漏洞  

有时候,我们不得不开发一些所谓的”调试用”代码。 但是,不要忘记了,虽然这些调试代码只是用来调试的,但是并不意味着我们就可以忽略掉安全性。 我记得,曾经有一位客户问过如下的问题: 我们正在开发一个后台服务,为了调试方便,我们想连接这个服务并提取一些存储在服务中的私密数据出来,通常情况下,这个数据不应该被任何人接触到。通过这种方式,我们就可以对比下,看看这些数据是否是我们所预...

信号量对象没有所有者  

相较于互斥对象(Mutex)和临界区对象(Critical Section) ,信号量没有所有者,它们只有计数。 ReleaseSemaphore 函数将会以指定的数量增加对应信号量对象的计数。 (增加计数这个动作,可能会释放正在等待的线程)但是释放信号量的线程不必与最初声明它的线程相同。这与互斥对象和临界区对象不同,后者要求声明线程也是释放线程。 有些人以类似互斥对象的方式使用信号量: 他们创建...

一则历史:为什么网络路径前加一个盘符还能正常工作  

有一个比较知名的奇异特性:文件系统在解析 UNC(Universal Naming Convention) 路径时,会故意忽略掉最前面添加的盘符字母。 举个例子,假设服务器上有一个共享文件夹,其路径为:\\server\share\directory,如果你在命令提示符下输入下面的命令: dir P:\\server\share\directory 初看下来,这条指令应该不会执行成功,因为最前面的...

说说 HWND_TOP 和 HWND_TOPMOST 的区别  

初看上去,HWND_TOP 和 HWND_TOPMOST 有点类似,但是实际上在调用 DeferWindowPos 或者 SetWindowPos时,它们之间的差别还挺大。 在同级窗口的维护机制中,有一个概念叫做 Z 序 (Z-order) 。出于此讨论的目的,顶级窗口也被视为同级窗口。事实上,大多数人在说”Z 序”时想到的正是顶级窗口的 Z 序。 Z 序应可视化为窗口的垂...

为什么 PostQuitMessage 会被设计出来?  

众所周知,我们可以使用 SendMessage 或者 PostMessage 来发送消息,那为什么在 Win32 API 中,会单独设计一个 PostQuitMessage 呢? 有一位读者 A. Skrobov 问我,”PostQuitMessage 和 PostThreadMessage(GetCurrentThreadId, WM_QUIT) 到底有什么区别,我怎么看起来是一样的...

COM接口规则的存在是有原因的  

可能有些人认为接口上的 COM 接口规则没有必要设计的那么严格,但我想说的是,这些规则的存在是有原因的。 假设你在你的产品代码中新增加了版本号为 N 的接口,由于这个接口是内部使用的,没有任何公开文档。所以你可以随意修改它,而不会打破任何不兼容性。 但是需要注意的是,如果你修改一个接口,则必须要生成一个新的接口标识符(IID),因为一个接口标识符唯一标识了这个接口(正如它的名字所暗示的那样)。 以...

用户界面对象的线程亲缘性第五篇: 对象清理  

作为一项基本原则,当一个进程退出的时候,窗口管理器和 GDI 对象会自动释放掉此进程中已创建的底层对象。(另外,窗口管理器在窗口所属线程退出的时候,也会听同时销毁窗口。) 请注意,这只是一个”兜底”机制,不应该成为资源泄露的借口,不应该觉着:”泄露点资源没事的,反正窗口管理器最终会帮我释放所有资源”,因为它是最后一道防线,我们不应该将它视作主要的资源...

用户界面对象的线程亲缘性第四篇: GDI 对象及其他  

相对于之前的线程亲缘性主题相关的几篇文章,GDI 对象要简单得多。 作为一般规则,它们都具有进程相关性:创建它们的进程中的任何线程都可以使用它们。如果使用来自多个线程的 GDI 对象,则负责协调对象的使用。也就是说,你确实可以在主线程中创建 GDI 对象,然后在另一个线程中操作它,这没有任何问题,但需要自己做好线程同步,具体请看下面的说法。 要注意的是,窗口管理器和 GDI 对象通常保持其各自的对...

用户界面对象的线程亲缘性第三篇: 菜单,图标,光标和快捷键表  

经过前两篇文章的讲解,我们了解到了窗口句柄和设备上下文在线程亲缘性方面的特点,今天,继续讲解其他用户界面组件,它们是:菜单,图标,光标和快捷键表。 菜单没有线程亲缘性。任何线程都可以使用菜单。但是,如果两个线程使用菜单,则这些线程负责协调如何使用该菜单,例如,一个线程不会修改菜单,而另一个线程正忙于显示菜单。(稍后会详细介绍此主题。) 图标、光标和快捷键表的行为类似于菜单。它们没有线程亲缘性。它们...

用户界面对象的线程亲缘性第二篇: 设备上下文  

在上一篇文章中,我们简单地介绍了控制窗口句柄的线程亲缘性规则。 今天,我们来讲讲设备上下文(Device Context, 简称 DC) 。 设备上下文也有一定程度的线程亲缘性。调用 DC 相关函数,例如 GetDC 的线程,必须在同一个线程中调用其对应的 ReleaseDC。但和窗口句柄一样,在 DC 对象的生存期内,任何线程都可以访问它。 如果你希望以多线程方式使用 DC,则负责协调该设备上下...