在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中,该函数需要告诉您它在哪里分配新缓冲区,因此您必须告诉它将该地址放在何处。您必须传递一个接收该地址的指针变量的地址。

简而言之:
  • #1需要一个TCHAR*到现有缓冲区
  • #2需要一个TCHAR**来接收新的缓冲区

  • 这就是为什么在使用#2时必须类型转换lpBuffer参数的原因。

    关于c++ - 为什么需要在FormatMessage中强制转换lpBuffer(LPTSTR)参数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24214251/

    10-11 02:26