wsprintf如何知道lpFmt字符串的长度?

时间:2016-01-25 20:01:28

标签: winapi

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

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

3 个答案:

答案 0 :(得分:1)

LPCTSTR 以null结尾。它是

const char* 

const wchar_t*

取决于您是否以Unicode为目标。但不管怎样,它都是空终止的。

答案 1 :(得分:0)

UNICODE的LPCTSTR定义为LPCWSTR,在msdn docs中,您可以读取LPCWSTR定义为:

  

指向16位Unicode的常量以null结尾的字符串的指针   字符。有关更多信息,请参阅使用的字符集

所以wsprintf读取格式,直到找到L'\ 0'字符。它实际上没有在wsprintf doc。

中明确写出

答案 2 :(得分:0)

你混淆了许多事情

_cdecl从__stdcall推迟如何推送堆栈中的参数,它与NULL终止的字符串无关。

然后LPCTSTR,LPSTR,char * wchar *,都是以NULL结尾的字符串(区别在于其中一些是Unicode,而其他是Ansi

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