为什么我需要在FormatMessage中强制转换lpBuffer(LPTSTR)参数?

时间:2014-06-13 21:49:31

标签: c++ c winapi formatmessage

在Windows' FormatMessage()函数,参数:

  _Out_     LPTSTR lpBuffer

正在努力。继Hart的Windows系统编程书之后,我宣布一个LPTSTR指针用作lpBuffer(例如{{1} }}),然后调用LPTSTR errortext;函数。

传递此参数的正确方法是:FormatMessage()

这很好用。但我不明白为什么我需要写(LPTSTR)&errorText。我理解这个类型转换并且我读了它但它对我没有意义,因为我没有改变变量类型或任何东西,我宣称它是(LPTSTR)和我将其内存地址传递给函数,函数需要LPTSTR并且我传递LPTSTR,所以为什么我需要将LPTSTR作为(LPTSTR)的一部分{1}}参数?

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

简而言之:

  • #1需要TCHAR*到现有缓冲区
  • #2需要一个接收新缓冲区的TCHAR**

这就是使用#2时必须对lpBuffer参数进行类型化的原因。