Текущий архив: 2005.12.11;
Скачать: CL | DM;
ВнизFormatMessage и освобожение буфера Найти похожие ветки
← →
Конст (2005-10-12 21:34) [0]Хотел уточнить: нужно освобождать буфер, если я вызываю функцию 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-12 21:39) [1]> Конст (12.10.05 21:34)
Ну, во-первых, не @lpMsgBuf, а просто lpMsgBuf.
А во-вторых, ответ на вопрос есть в MSDN:
FORMAT_MESSAGE_ALLOCATE_BUFFER The 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 should use the LocalFree function to free the buffer when it is no longer needed.
← →
Конст (2005-10-12 22:06) [2]Если просто lpMsgBuf без @ вылетает AV
← →
Джо © (2005-10-12 22:44) [3]
> lpMsgBuf := nil; // это нужно ?
Это не нужно. Нужно LocalFree.
← →
Конст (2005-10-12 23:09) [4]LocalFree(Cardinal(lpMsgBuf));
Маленький вопрос: выражение Cardinal(lpMsgBuf); возвращает хэндл обекта ? Просто в первый раз с таким сталкиваюсь... но все работает, т.е
GetLastError возвращает ERROR_SUCCESS
← →
Джо © (2005-10-12 23:28) [5]
> выражение Cardinal(lpMsgBuf); возвращает хэндл обекта
Нет, это просто приведение типа. LocalFree объявлена в windows.pas с параметром типа Cardinal (4-байтное целое) а lpMsgBuf у тебя объявлено как PChar. То есть указатель, то есть, тоже самое 4-байтное целое. Ну вот ты и используешь приведение одного типа к другому, одного и того же размера.
← →
Конст (2005-10-12 23:34) [6]Понятно. Спасибо за ответы!
← →
begin...end © (2005-10-13 08:15) [7]> Конст (12.10.05 22:06) [2]
Да, похоже, я ошибся. Извините.
Страницы: 1 вся ветка
Текущий архив: 2005.12.11;
Скачать: CL | DM;
Память: 0.45 MB
Время: 0.034 c