Зачем мне приводить параметр lpBuffer (LPTSTR) в FormatMessage?

В винде 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.

4

Другие решения


По вопросам рекламы [email protected]