【发布时间】:2014-08-04 12:58:08
【问题描述】:
在Windows的FormatMessage()函数中,参数:
_Out_ LPTSTR lpBuffer
正在努力。按照 Hart 的 Windows 系统编程书,我声明了一个 LPTSTR 指针用作 lpBuffer(例如 LPTSTR errortext;),然后调用 FormatMessage() 函数.
这个参数的正确传入方式是:(LPTSTR)&errorText
这很好用。但我不明白为什么我需要写(LPTSTR)。我知道这是类型转换,我读过它,但对我来说没有意义,因为我没有更改变量类型或任何东西,我将其声明为 LPTSTR 并将其内存地址传递给函数,该函数需要一个LPTSTR,而我传递给它一个LPTSTR,那么为什么我需要将(LPTSTR) 作为lpBuffer 参数的一部分?
【问题讨论】:
-
嗯,你是对的,使用演员表是从不正确的。它只会阻止编译器告诉你你做错了。如果您不发布代码,为什么您认为您需要它是无法发现的。
-
您需要展示一些代码。你究竟是如何声明
errortext。它的内存是如何分配的?你在用FORMAT_MESSAGE_ALLOCATE_BUFFER吗? -
@HansPassant 这不是演员阵容是唯一解决方案的例子吗?这就是为什么我认为这是一个好问题,它不是关于调试,而是关于理解为什么需要演员表,IMO。
-
不,char[] 和 wchar_t[] 在结构上不兼容,元素的大小不同。无论如何,强制转换要么产生中文或单个字符的 C 字符串,而且缓冲区溢出的可能性很高,YMMV。它需要转换,例如 MultiByteToWideString()。
-
但是演员表是
TCHAR*,因为这个函数只需要TCHAR*。该函数有两种不同的用法,一种是TCHAR*,另一种是TCHAR**,看我的回答。
标签: c++ c winapi formatmessage