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

2024-04-26

我被指派更新用 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 API 的遗留物,但我无法从 google 找到任何东西。

有谁知道PCTSTR 是做什么用的?我猜因为这是来自以前有效的旧代码。有什么想法如何编译? [我将其更改为 LPCTSTR 并编译了,我想知道除了更改定义​​名称之外是否还有其他方法]


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

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

这使得 PCTSTR 成为一种不合时宜的人类和恐龙电影风格。 Windows 从来没有 16 位 Unicode 版本,32 位版本的 Windows 始终使用 32 位指针。这听起来像是一个错误。不过,当前版本的 winnt.hdoes有一个 typedef,使其与 LPCTSTR 相同。并且仅用于onestralign.h 头文件中有一个名为 TSTR_ALIGNED_STACK_COPY 的奇怪函数。但仅在评论中。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么没有定义 PCTSTR 而定义了 LPCTSTR? 的相关文章

  • 宏扩展忽略了 MSVC 中的一些标记

    我在 msvc 编译器中遇到宏扩展问题 我希望将以下代码扩展为F x 它在 gcc 和 clang 上执行 但 msvc 将其扩展为F忽略x令牌 这里发生了什么 define S s s define F define M S S F x
  • 以编程方式最大化屏幕一半的窗口

    我想最大化屏幕左侧的随机窗口 我可以在我的代码中使用 Windows Aero 函数吗 这个窗口can像用鼠标一样最大化 我只想以编程方式做到这一点 I use C 我可以得到IntPtr窗户的 如果可能的话 不要伪造鼠标或键盘输入 这可以
  • 如何指示窗口过程中处理消息时出现的错误?

    我目前正在编写一个库来处理来自原始输入 API 的信息 并且我正在使用级联函数 这导致了几个非常小 非常可读且非常集中的函数 但是 它让我震惊 我不明白如何properly表明 Windows 出现故障 我有这个功能 OnInput Han
  • EnumChildWindows 还是 FindWindowEx?

    我可以选择使用 API EnumChildWindows 或 FindWindowEx 中的任何一个 有什么建议哪个 api 更注重性能 FindWindowEx 内部是否使用 EnumChildWindows 来获取特定窗口的句柄 这实际
  • Windows EventLog:它的操作速度有多快?

    我有一个服务应用程序 它通过 TCP 处理客户端请求并将任何事件写入 Windows EventLog 由于该应用程序预计会在短时间内为许多客户端和每个客户端的大量请求提供服务 假设每秒 1 到 50 个请求 因此我很想知道密集程度 CPU
  • 如何在 VC++ 中使用 _W64 和 __w64?

    有这样的事情 w64 http msdn microsoft com en us library s04b5w00 VS 71 aspx在 Visual C 9 中 我在尝试将本机 C DLL 移植到 64 位时遇到了它 特别是在crtde
  • 编译器优化导致性能下降

    我有一个奇怪的问题 我有以下代码 template
  • 如何使用VerQueryValue?

    我有一个 exe 需要从特定 dll 检索版本信息 例如 FileDescription 我的代码已经调用了 GetFileVersionInfoSize 和 GetFileVersionInfo 但我不知道如何应用 VerQueryVal
  • 使用带有 MSVC 2015 编译器的 QT Creator 5.8

    我是新来的C 和编程 我正在尝试做一个小项目 使用Qt and Qt Creator 我当时用的是MinGW compiler 但对于这个项目 我需要与MSVC compiler 因为我需要使用QtWebEngineWidgets I ha
  • 在命令行上编译 C++/CX

    我收到链接器错误fatal error C1107 could not find assembly platform winmd please specify the assembly search path using AI or by
  • VC++ 代码 DOM 可以从 VS 插件访问吗?

    Visual Studio IntelliSense for VC 包括 完整 EDG C 解析器 http www edg com location c frontend 英特尔和其他公司也使用 由于插件可以访问 C Code DOM 如
  • 如何在 VC++ 项目中引用 DLL

    我有一个正在尝试编译的 C 驱动程序 它的代码中有这一行 import msado15 dll no namespace rename EOF EndOfFile 但是当我编译项目时 出现错误 错误1致命错误C1083 无法打开类型库文件
  • 如果我被冒充,为什么 Win32 API 函数 CredEnumerate() 会返回 ERROR_NOT_FOUND?

    我编写了一些示例代码 当我在普通用户帐户的上下文中从 Windows 命令提示符调用这些代码时 会使用 CredEnumerate 转储所有用户保存的凭据 但是 我真的希望能够从 SYSTEM 用户上下文执行此操作 因此我从 SYSTEM
  • 在 C# 中打开的资源管理器窗口中获取文件/目录列表

    我试图拉出打开的资源管理器窗口中列出的文件和目录列表 与显示的顺序相同 以便我可以查看它 然后将焦点设置到特定项目 我找到了这段代码here https stackoverflow com questions 14193388 how to
  • 当用户拖动列表视图项目时检测何时需要滚动

    介绍 我正在实现列表视图项目的重新排列 而不使用 OLE 拖放 PROBLEM 我已经成功解决了大部分任务 除了当用户想要将项目放置在当前不可见的位置时向上 向下滚动之外 问题 我可以使用以下消息向上 向下滚动列表视图 SendMessag
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • 预注册 ATL 窗口类

    我在一个项目中使用了 ATL 和 WTL 的组合 并从中派生了我自己的类CWindowImpl 看起来像这样 class CMyControl public CWindowImpl
  • 获取已安装的 Windows 应用商店应用程序列表

    有多种方法可以获取控制面板中 添加 删除程序 中已安装应用程序的列表 但我也想从 Windows 应用商店获取已安装应用程序的列表 到目前为止我还没有得到任何东西 有什么方法可以获取从 Windows 应用商店安装的应用程序列表吗 您可以在
  • 如何用C语言测量时间?

    我想知道某个代码块执行了多长时间 大约 像这样的事情 startStopwatch do some calculations stopStopwatch printf lf timeMesuredInSeconds How 您可以使用clo
  • win32 内容已更改,但除非移动窗口,否则不会显示更新

    我的 win32 GUI 内容每秒都会更改 但除非手动移动窗口 否则不会显示更新 我尝试每秒弹出一个消息框来触发窗口刷新 它成功了 因此 这证明我的内容确实发生了变化 但窗口没有更新 我希望刷新窗口而不是每次都弹出消息框 有没有这样的窗口功

随机推荐