如果你阅读以前的代码,将会经常发现有类型转换看上去是多余的:

SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)(LPSTR)"str");

为什么“str”要首先被转换到LPSTR?这个字符串已经是个LPSTR!

这是在16位Windows中遗留下来的问题。我们还记得在16位Windows中声明指针时,默认情况下是生成一个近指针。因此,“str”是一个指向字符串的近指针。如果代码被写成下面这样:

SendMessage(hwndListBox, LB_ADDSTRING, 0, (LPARAM)"str");

那么这个近指针将被转换为一个长整数值。由于近指针是16位的值,因此程序将通过零扩展把指针扩展为32位长整数。

然而,在窗口消息中,所有的指针都必须是远指针,因为接收消息的窗口过程可能与发送消息的代码是在两个不同的模块中。近指针需要和默认选择符组合在一起再使用,而在每个模块中的默认选择符是不同的。如果只是传递一个近指针给另一个模块,那么将会导致这个指针和接收模块的默认选择符放在一起使用,而这个默认选择符与发送模块的默认选择符是不同的。

不过在Win32中,你无需去担心这个问题了,你是不是应该感到很高兴?

巨指针百度百科

远指针百度百科