【发布时间】: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