Зачем мне приводить параметр lpBuffer (LPTSTR) в FormatMessage?
В функции Windows FormatMessage() параметр:
_Out_ LPTSTR lpBuffer
Я вхожу в голову. Следуя указаниям книги Харта по системному программированию Windows, я объявляю LPTSTR
указатель для использования в качестве lpBuffer
(например LPTSTR errortext;
), а затем вызывая FormatMessage()
функция.
Правильный способ передачи этого параметра: (LPTSTR)&errorText
Это отлично работает. Но я не понимаю, зачем мне писать (LPTSTR)
, Я понимаю, что это типизация, и я читаю об этом, но для меня это не имеет смысла, потому что я не изменяю тип переменной или что-то еще, я объявил ее как LPTSTR
и я передаю свой адрес памяти функции, функция ожидает LPTSTR
и я передал это LPTSTR
так зачем мне ставить (LPTSTR)
как часть lpBuffer
параметр?
1 ответ
Параметр lpBuffer
из FormatMessage()
задокументировано следующим образом:
Указатель на буфер, который получает строку с нулевым символом в конце, которая определяет форматированное сообщение. Если 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.