1

在 Windows 的FormatMessage()函数中,参数:

  _Out_     LPTSTR lpBuffer

正在努力。按照 Hart 的 Windows 系统编程书,我声明一个LPTSTR指针用作lpBuffer(例如LPTSTR errortext;),然后调用该FormatMessage()函数。

传入这个参数的正确方法是:(LPTSTR)&errorText

这工作正常。但我不明白为什么我需要写(LPTSTR)。我知道这是类型转换,我读过它,但这对我来说没有意义,因为我没有更改变量类型或任何东西,我将它声明为 anLPTSTR并且我将它的内存地址传递给函数,函数期望 anLPTSTR并且我将它传递给了LPTSTR,那么为什么我需要将(LPTSTR)其作为lpBuffer参数的一部分呢?

4

1 回答 1

4

lpBuffer的参数FormatMessage()记录如下:

指向缓冲区的指针,该缓冲区接收指定格式化消息的以 null 结尾的字符串。如果 dwFlags 包含 FORMAT_MESSAGE_ALLOCATE_BUFFER,该函数使用 LocalAlloc 函数分配一个缓冲区,并将指向该缓冲区的指针放在 lpBuffer 中指定的地址。

所以有 2 种不同的用法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**接收新缓冲区的

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

于 2014-06-13T22:41:22.940 回答