在Windows的FormatMessage()函数中,参数:
_Out_ LPTSTR lpBuffer
正在努力。从Hart的Windows系统编程书开始,我要声明一个
LPTSTR
指针用作lpBuffer
(例如LPTSTR errortext;
),然后调用FormatMessage()
函数。传递此参数的正确方法是:
(LPTSTR)&errorText
这很好。但是我不明白为什么我需要写
(LPTSTR)
。我知道这是类型转换,但我对它没有了解,因为我没有更改变量类型或任何内容,我将其声明为LPTSTR
,并将其内存地址传递给函数,即函数需要一个LPTSTR
,我将其传递给LPTSTR
,那么为什么需要将(LPTSTR)
作为lpBuffer
参数的一部分? 最佳答案
lpBuffer
的参数FormatMessage()
记录如下:
因此FormatMessage()
有2种不同的用法,
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
参数的原因。关于c++ - 为什么需要在FormatMessage中强制转换lpBuffer(LPTSTR)参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24214251/