visual-c++ - 为什么没有定义 PCTSTR 但定义了 LPCTSTR?

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

我 grep C:\Program Files\Microsoft Visual Studio\VC98\Include\文件夹,但没有找到 PCTSTR 的定义。但令我惊讶的是,当我搜索 Windows SDK 文件夹 [C:\[C:\Program Files\Microsoft SDK\Samples\winui\Resource\Iconpro*]。所以我猜这可能只是 16 位 Windows 的 Windows API 的遗留物,但我无法从谷歌找到任何东西。

有谁知道 PCTSTR 的用途。我猜是因为这是以前有效的旧代码。任何想法如何进行编译? [我把这个改成LPCTSTR编译通过了,想知道除了改定义名还有没有别的方法]

最佳答案

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

LPCTSTR 中的 T 表示 TCHAR,是 char 或 wchar_t 的类型定义,具体取决于 UNICODE 宏的存在。

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

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

https://stackoverflow.com/questions/9063401/

相关文章:

matlab - 将向量转置到三维

asp.net - Web API 可以将XML 转换成Json 吗?

logging - 如何在 Glassfish 中设置日志记录级别?

c# - 如何判断对象初始化程序何时完成

bash - 在 bash 中,如何在键入命令行时扩展 !$?

erlang - 在没有列表到字符串翻译的情况下格式化 Erlang 术语

macos - 如何在终端加载 I/O 套件驱动程序扩展?

ruby-on-rails - Errno::ETIMEDOUT:连接超时 - connect(2)

image - 如何使用 htaccess 更改图像路径?

jquery - 如何使用 jQuery 取消按钮的提交