2

我已被分配更新用 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并编译好了,我想知道除了改定义名还有其他方法吗]

4

2 回答 2

10

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 的奇怪函数。但是,仅在评论中。

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

于 2012-01-30T13:12:29.640 回答
0

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

于 2012-01-30T12:47:09.463 回答