Зачем мне приводить параметр 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.

Другие вопросы по тегам