Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо