首页

为什么对象明明支持接口却得到E_NOINTERFACE?  

解密时刻 经常有朋友问到这样一个问题:当我调用CoCreateInstance获取一个对象接口的时候,我明明知道,这个对象已经实现了我想要的接口,但是CoCreateInstance还是无情地返回了E_NOINTERFACE,这是怎么回事儿。 这个问题,实际上和”IMarshal接口丢失”是一样的问题,只不过你需要从另一个角度来看待。 如果你的线程模型和你准备创建的对象模型...

外壳对象拖放第五部分:让ListView控件来干脏活  

在上一篇文章中,我们讲述了如何在拖动的时候显示一个自定义的小图标。这个功能看起来不算复杂,但也需要一些开发的工作。幸运的是,我们可以借助ListView控件来简化这部分的开发工作。 下面我们来具体看看。 我们不再需要OnLButtonDown函数了,所以现在就将它们删除,注意,需要连带这消息映射宏一起删除才行。然后我们通过下图的代码来实现相同的功能。 现在,我们可以让ListView控件来处理图...

外壳对象拖放第四部分:添加一个漂亮的拖动小图标  

如果你是Windows的老玩家,你可能注意到这么一件事:当拖动文件的时候,文件图标上会有一个细小的指示图标,可能图标的样子令人难以捉摸,一般会是一个小的方框,可能会有一个加号,或者箭头之类的,如果不是老司机,可能会被这些小图标搞蒙了。 让我们来改进改进如何?当我们拖动一个文件的图标时,我们需要添加一个拖动图片到我们的数据对象上(Data Object)上,如下图所示: 如上面你所看到的,我们制作...

外壳对象拖放第三部分:如何检测一个优化后的移动操作  

我们正在考虑如何检测用户拖放对象时的出现的移动操作,即使DROPEFFECT_MOVE已被优化掉的情况下。 如果一个放置目标是外壳,则你可以查询数据对象的CFSTR_PERFORMEDDROPEFFECT标志位来判断执行后的效果是什么。 代码如下: 在上面的代码中,我们在鼠标左键按下时,先判断效果标志是否为DROPEFFECT_MOVE,如果是,则删除源文件。然后我们调用了一个新的函数Check...

如何使用C++20解决一系列运行时错误  

C++20已经发布了一阵子了,并已经被MSVC v16.11及以上版本所支持。今天的文章的主题,不是讲如何使用它,而是讲我们作为编译器开发人员,是如何借助C++20来有效地清除一些列运行时错误。不多啰嗦,直接上东西。 最初的做法 在设计编译器时,你需要考虑的第一件事就是需要提醒开发者他的代码是否有错误或者潜在的非预期行为。在MSVC编译器的实现中,我们采用了如下图所示的错误模型: 上图中的err...

外壳对象拖放第二部分:支持移动操作  

如我所承诺的。 今天我会讲讲如何在之前的代码的基础上,添加拖动时移动对象的支持。这一次,我们不再使用我们的老朋友”clock.avi”,而是新创建一些测试文件。让我们假设在C盘创建一个测试文件,且叫它throwaway.txt。然后,我们修改OnLButtonDown函数的代码,如下图所示: 哦等等,有朋友会认为我在提倡硬编码路径(把路径在程序中写死),那我们就将程序稍微...

外壳对象拖放第一部分:获取IDataObject接口  

外壳(Shell)会给你一个IDataObject接口,你所需要做的,就是将它”拖来拖去”。 顺便说一下,今天这篇文章是外壳对象拖放系列文章的第一篇,请各位猿友坐稳,扶好,要发车了。 我们还是回到之前的基础例子程序中,然后我们添加之前文章中讲到的GetUIObjectOfFile函数。另外,我们将CoInitialize/CoUninitialize调用修改为OleInit...

为什么多个文件打印时顺序是随机的?  

请考虑这样一个场景 一个文件夹里有五个文档,你选择它们,然后右键选择”打印”,系统会将它们打印出来,这毫无疑问。但是如果你细心观察一下,就会发现系统打印它们的顺序是随机的,这是为啥呢? 并没有魔幻的事情发生。 外壳会一次在每个文档上执行”打印”这个动作,根据对应的打印程序事先注册好的打印流程,来执行下面几个动作中的一种: > 大多数情况下,打印...

为什么Win9x的定时器精度为55毫秒?  

在Windows 95上,定时器的精度为55毫秒,原因可以追溯到IBM电脑的BIOS。原版的IBM电脑使用到了一枚1.19MHz的晶振芯片,而此频率下的65536个CPU周期刚好差不多就是55毫秒。为什么说是刚好?因为如果要更加精确的话,实际的频率为1.19318MHz,实际的时间为54.92毫秒。 这就又引出了另外一个问题。为什么频率是1.19MHz呢? 如果采用这个频率,则2的16次方大概是3...

关于BITMAP位图结构体中的颜色平面的理解  

有一些问题,可能你一直都没时间真正去搞懂,今天的主题就算其中一个。 在Windows中,很多和位图相关的结构体中,会有一个所谓的”planes”的成员。举个例子,在BITMAPINFOHEADER这个结构体中有一个biPlanes的成员,而且它还必须设置为1。在BITMAP结构体中有一个bmPlanes成员。那么,这东西,到底有啥用呢? 请听在下给翻译翻译。 EGA(Enh...