为什么没有定义PCTSTR但定义了LPCTSTR?

时间:2012-01-30 11:48:26

标签: visual-c++ winapi tchar

我被分配来更新用MSVC ++ 6编写的旧代码。我已经获得了PCTSTR的未知定义,但即使我包含了tchar.h,它也没有定义。根据我之前的经验,我知道有一个LPTSTR,但没有PCTSTR。

我grep C:\ Program Files \ Microsoft Visual Studio \ VC98 \ Include \文件夹,但没有找到PCTSTR的定义。但令我惊讶的是,当我搜索Windows SDK文件夹[C:\ Program Files \ Microsoft SDK]时,没有PCTSTR的定义,但它被用于其中一个样本中。 [C:\ Program Files \ Microsoft SDK \ Samples \ winui \ Resource \ Iconpro *]。所以我猜这可能只是来自16位Windows的Windows API的遗物,但我找不到谷歌的任何东西。

有谁知道什么是PCTSTR?我猜测,因为这是来自旧的代码,这是以前的工作。任何想法如何编译? [我将此更改为LPCTSTR并编译,我想知道是否还有其他方法而不是更改定义名称]

2 个答案:

答案 0 :(得分:9)

LPCTSTR中的LP表示长指针。这是一款来自Windows 3天的神器,一个16位操作系统。当你只有一个16位的cpu寄存器时,16位代码有几种内存模型来处理尝试寻址超过65536字节的内存。短指针使用默认数据段寄存器值和16位偏移量。长指针为32位,16位用于加载段寄存器,16位用于偏移量。

LPCTSTR中的T表示TCHAR,char或wchar_t的typedef,具体取决于UNICODE宏的存在。

这使得PCTSTR成为时间不合时宜的人类和恐龙电影风格。从来没有一个16位的Unicode版本的Windows,32位版本的Windows总是使用32位指针。这听起来只是一个错误。尽管如此,当前版本的winnt.h 确实有一个typedef,使其与LPCTSTR相同。并且仅在一个位置使用,stralign.h头部带有一个名为TSTR_ALIGNED_STACK_COPY的奇怪函数。但只是在评论中。

错误。你的解决方法是正确的选择。

答案 1 :(得分:0)

在我的机器上的Windows SDK v7.0a中,WinNT.h包含两个不同的PCTSTR类型定义,具体取决于是否定义了UNICODE。在这两种情况下,LPCTSTR的定义方式相同 - 所以现在这两个都是等价的。