![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
FormatMessage и освобожение буфера [D7, WinXP]
Конст © (2005-10-12 21:34:00)Хотел уточнить: нужно освобождать буфер, если я вызываю функцию FormatMessage так:
procedure TForm1.Button1Click(Sender: TObject);
var
lpMsgBuf: PChar;
begin
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM+FORMAT_MESSAGE_ALLOCATE_BUFFER,nil,
StrToInt(Edit1.Text),LANG_NEUTRAL,@lpMsgBuf,0,nil);
Memo1.Text := lpMsgBuf;
lpMsgBuf := nil; // это нужно ?
end;
Спасибо.
begin...end (2005-10-13 08:15:00) [1]> Конст (12.10.05 22:06) [2]
Да, похоже, я ошибся. Извините.
Конст (2005-10-12 23:34:00) [2]Понятно. Спасибо за ответы!
Джо (2005-10-12 23:28:00) [3]
> выражение Cardinal(lpMsgBuf); возвращает хэндл обекта
Нет, это просто приведение типа. LocalFree объявлена в windows.pas с параметром типа Cardinal (4-байтное целое) а lpMsgBuf у тебя объявлено как PChar. То есть указатель, то есть, тоже самое 4-байтное целое. Ну вот ты и используешь приведение одного типа к другому, одного и того же размера.
Конст (2005-10-12 23:09:00) [4]LocalFree(Cardinal(lpMsgBuf));
Маленький вопрос: выражение Cardinal(lpMsgBuf); возвращает хэндл обекта ? Просто в первый раз с таким сталкиваюсь... но все работает, т.е
GetLastError возвращает ERROR_SUCCESS
Джо (2005-10-12 22:44:00) [5]
> lpMsgBuf := nil; // это нужно ?
Это не нужно. Нужно LocalFree.
Конст (2005-10-12 22:06:00) [6]Если просто lpMsgBuf без @ вылетает AV
begin...end (2005-10-12 21:39:00) [7]> Конст (12.10.05 21:34)
Ну, во-первых, не @lpMsgBuf, а просто lpMsgBuf.
А во-вторых, ответ на вопрос есть в MSDN:
FORMAT_MESSAGE_ALLOCATE_BUFFERThe lpBuffer parameter is a pointer to a PVOID pointer, and that the nSize parameter specifies the minimum number of TCHARs to allocate for an output message buffer. The function allocates a buffer large enough to hold the formatted message, and places a pointer to the allocated buffer at the address specified by lpBuffer. The caller shoulduse the LocalFree function to free the buffer when it is no longer needed.