在Windows' FormatMessage()函数,参数:
_Out_ LPTSTR lpBuffer
正在努力。继Hart的Windows系统编程书之后,我宣布一个LPTSTR
指针用作lpBuffer
(例如{{1} }}),然后调用LPTSTR errortext;
函数。
传递此参数的正确方法是:FormatMessage()
这很好用。但我不明白为什么我需要写(LPTSTR)&errorText
。我理解这个类型转换并且我读了它但它对我没有意义,因为我没有改变变量类型或任何东西,我宣称它是(LPTSTR)
和我将其内存地址传递给函数,函数需要LPTSTR
并且我传递LPTSTR
,所以为什么我需要将LPTSTR
作为(LPTSTR)
的一部分{1}}参数?
答案 0 :(得分:4)
lpBuffer
的参数FormatMessage()
记录如下:
指向缓冲区的指针,该缓冲区接收以null结尾的字符串 指定格式化的消息。如果dwFlags包括 FORMAT_MESSAGE_ALLOCATE_BUFFER,该函数使用分配缓冲区 LocalAlloc函数,并将指针放在缓冲区中 lpBuffer中指定的地址。
因此FormatMessage()
有两种不同的用法,
1)提供您自己的缓冲区
const DWORD bufsize = ....;
TCHAR buf[bufsize];
FormatMessage(.... buf, bufsize, ....); // buf is passed as a TCHAR*
2)FormatMessage为您分配缓冲区
const DWORD bufsize = ....;
TCHAR* buf = 0;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | ....,
.... (LPTSTR)&buf, bufsize, ....); // &buf is a TCHAR** so type-cast needed!
....
LocalFree(buf);
在#1中,你必须传递缓冲区中第一个TCHAR
的地址,该函数只是填充缓冲区。
在#2中,函数需要告诉你它在哪里分配一个新缓冲区,所以你必须告诉它在哪里放置那个地址。您必须传递接收地址的指针变量的地址。
简而言之:
TCHAR*
到现有缓冲区TCHAR**
这就是使用#2时必须对lpBuffer
参数进行类型化的原因。