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