首页

为什么DirectX 4未曾发布?

一段历史 如果你研究一下DirectX的历史,你就会发现:在它的发布历史中,压根就没有DirectX 4这个版本,而是直接从DirectX 3 跳到了DirectX 5 了,为啥? 是这么回事儿 当初,开发团队发布了DirectX 3 后,开发团队同时启动了两个新版本的开发工作:一个是短期发布版本DirectX 4 和一个长期发布版本DirectX 5。但是,从游戏开发者社区中我们得到了反馈:开发...

修复其他程序中的安全漏洞

在微软的产品中,一旦出现了和缓冲区溢出相关的崩溃错误,它的修复优先级将会很快的被提升到最高优先级。 最近我碰到过一些类似这样的缓冲区溢出的问题,它们实际上来自于其他应用程序,只不过最终被Windows检测到了。 举个例子,有一些应用程序会不正确的处理LVN_GETDISPINFO消息通知,他们会向LVITEM.pszText指向的缓冲区中写入多于LVITEM.cchTextMax的字符。 另一个例...

关于示例程序中使用的SDK版本说明

在之前我编写的例子代码里,我假定读者使用的是最新版本Platform SDK中的头文件,在这个版本中包含了对Win64的支持。 如果你使用的是旧的版本,则你会缺少对新数据类型的定义,例如UINT_PTR和INT,那么这个时候,你应该是用UINT和INT作为代替。 因为Windows中的实现代码都是要和Win64兼容的,所以我在编写示例程序时,也保持代码和Win64兼容。反之,我会十分抗拒编写不兼容...

关于IA64平台上的另一个误用  

蝎子 在之前的文章中,我说过IA64架构是一个十分热门的处理器架构(本文写于2004年)。那,今天我们就再来讲讲在IA64上容易出现的另一个误用。这个误用会生动地讲述:如果你欺骗了编译器,它会回过头来狠狠地咬上你一口。 在IA64处理器上,没有一个所谓的”绝对寻址”模式,而是通过r1寄存器来访问全局变量,这个寄存器还有另外一个别名”gp”(globa...

警示一条: IA64处理器上的未初始化数据带来的问题  

IA64上容易犯的错误 在周五的时候,我在一篇文章里讲述了错误的函数原型可能会造成的一些奇奇怪怪的问题。在IA64架构处理器上,如果使用了不相匹配的函数原型,则你还会碰到一些可能是比较致命的问题,虽然可能代码看起来没有大的问题。那我们下面具体就来看看。 Win32里有一个CreateThread的API函数,它会接受一个类型为LPTHREAD_START_ROUTINE的函数指针,它需要客户传递形...

为什么程序可以在被破坏的堆栈中”继续存活”?  

本文接上一篇文章 在x86架构,传统上会使用EBP寄存器来建立堆栈帧。一个典型的栈帧如下图所示: 上述汇编代码,会建立如下图所示的一个带有两个参数的__stdcall的函数栈帧: 函数的参数会基于EBP的正向偏移来进行访问。在上面的例子中,第一个参数为[ebp + 8],而本地变量则会基于EBP的负向偏移进行访问,例如:local2的值为[ebp – 8]。 现在假设:调用约定或函...

如果调用约定不匹配,会发生什么?  

蝎子 信不信由你,调用约定不匹配是程序经常出问题的原因之一。当你的程序代码中出现不相匹配的调动约定的时候,编译器会”大吼大叫”,但是懒惰的程序员只会在其中进行强制转换,以使编译器”尽快闭嘴”。 结果是:Windows不得不永远支持你编写的错误代码。 Windows窗口过程 有很多人会错误地声明了Windows窗口过程(通常是将它声明为__cdecl,...

为什么GetProcAddress获取不到dllexport导出的函数?

名称修饰(decoration)的好处和坏处 dllexport属性告诉链接器:请将指定的函数标记为导出并为它生成一个导出项。 这个导出项是经过修饰的,对于导出多个重载的函数来说,导出修饰后的名称是十分必要的。但是,这也意味着:你传入到GetProcAddress函数中的函数字符串也需要是修饰版本的。 从我们之前的几篇关于调用约定的文章中,我们知道,函数导出名称的修饰语法在各种硬件平台上是各不相同...

为什么只有静态成员函数才能作为回调函数?  

隐藏的this指针 对于非静态成员函数来说,它携带了一个隐藏的”this”指针,这导致它不能满足Win32回调函数签名的要求,这样的结果就是:一个非静态成员函数,不能作为一个合法的Win32回调函数。 幸运的是,几乎所有的回调函数都提供了一些方法来感知调用上下文。你可以将这个”this”指针作为一个上下文环境来重构代码,下面是一个例子: 有一些回调...

有关调用约定的历史 – 第三部分

好了,可以讲讲大家熟悉的东西了 今天的第三部分,主要内容是x86平台上的32位调用约定。 这里先说明一下:今天的内容只会涵盖Windows操作系统或者Windows编程中涉及到的调用约定,没有关于其他操作系统或者特定于某个语言或者编译器厂商的内容。特别需要注意的是,如果尝试在C++中调用一个成员函数,则函数的第一个参数是一个”隐藏”的this指针。 All 所有在x86平台...