【问题标题】:How wsprintf knows the length of lpFmt string?wsprintf 如何知道 lpFmt 字符串的长度?
【发布时间】:2016-01-25 20:01:27
【问题描述】:

wsprintf 使用_cdecl 调用约定,就像printf 一样。后者从堆栈中弹出一个以空结尾的格式字符串的地址。但是 wsprintf 的 winapi 定义使用 LPCTSTR 类型,例如最后没有null。

我想知道,如何计算 LPCTSTR lpFmt 的长度?我的意思是,该函数应该在某个时候停止读取格式缓冲区。它确实如此。它有效。

【问题讨论】:

  • 我投票结束这个问题,因为它提出了一个错误的陈述,然后根据这些错误的假设询问实施细节。一般用处不大。
  • 你说得对。我必须先阅读有关 Windows 数据类型的信息。部分我感到困惑,因为这样的代码在 fasm 中工作:cinvoke wsprintf, outputBuffer, '%d', eax 这让我觉得我在 lpFmt-string type 末尾缺少 \0 是正确的。我错了。
  • 好的,现在我看到了:cinvoke 宏以 '%d' 作为参数实际上声明了类似tmp db '%', 'd', 0 的内容,然后将tmp 的地址推入堆栈.

标签: winapi


【解决方案1】:

LPCTSTR 以空值终止。这是

const char* 

const wchar_t*

取决于您是否以 Unicode 为目标。但无论哪种方式,它都是空终止的。

【解决方案2】:

UNICODE 的 LPCTSTR 被定义为 LPCWSTR,在msdn docs 中你可以读到 LPCWSTR 被定义为:

指向 16 位 Unicode 的以空字符结尾的常量字符串的指针 人物。有关详细信息,请参阅使用的字符集

所以 wsprintf 读取格式直到找到 L'\0' 字符。其实wsprintfdoc里面并没有明确写出来。

【讨论】:

    【解决方案3】:

    你混淆了很多东西

    _cdecl 通过如何将参数压入堆栈来推迟 __stdcall,它与 NULL 终止的字符串无关。

    那么 LPCTSTR、LPSTR、char* wchar * 都是以 NULL 结尾的字符串(不同的是其中一些是 Unicode 而另一些是 Ansi

    micrsoft 使用的其他类型的字符串(这里没有提到)是 BSTR,BSTR 不是终止字符串,它的 len 存储在 buff[-1] 中; (BSTR 是一个 16 位字符的字符串,如 Unicode)

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-23
      相关资源
      最近更新 更多