ATL布幔之下的秘密(5)
2006-07-22 22:54:48 来源:WEB开发网这个和方法看起来比第一个要好,但是它仍然有两个问题。第一,如果用户希望使用cbWndExtra,那么他/她就可能会覆盖着一技术所使用的数据,这样客户就需要在使用cbWndExtra的时候十分注意了,以防丢失信息。那么好了,你可以在文档中写明在使用你的库时不要使用cbWndExtra,但是仍然会有一个问题:这个方法并不是很快,又一次违背了ATL的规则——ATL应该尽可能地小和快。
ATL没有使用这两个方法中的任何一个,它使用的方法被称作Thunk。Thunk是一个小系列的代码,并且这一术语被用在不同的地方。你可能曾经听过两种Thunking:
Universal Thunking
Universal Thunking允许在16位代码中调用32位的函数,在Win 9x和Win NT/2000/XP下都可以使用,也被称作Generic Thunking。
General Thunking
General Thunking允许在32位代码中调用16位的函数,它只能用在Win 9x中,因为Win NT/2000/XP是纯32位操作系统,所以在32位代码中调用16位的函数不合乎逻辑。General Thunking也被称作Flat Thunking。
ATL没有使用这两种方法,因为你不会在ATL中将16位和32位的代码混合。事实上,ATL插入了一小段代码来调用正确的窗口过程。
在研究ATL的Thunking之前,让我们先从一些基础概念开始。请看下面的简单程序。
程序72. #include <iostream>
程序的输出为:
using namespace std;
struct S
{
char ch;
int i;
};
int main()
{
cout << "Size of character = " << sizeof(char) << endl;
cout << "Size of integer = " << sizeof(int) << endl;
cout << "Size of structure = " << sizeof(S) << endl;
return 0;
}Size of character = 1
一个整型和一个字符的尺寸之和应该是5而不是8。那么让我们略微修改一下程序,再添加一个成员变量,看看会发生什么。
Size of integer = 4
Size of structure = 8
更多精彩
赞助商链接