Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.045 c
14-1131958924
Юрий Зотов
2005-11-14 12:02
2005.12.11
Чемпионат сайта по бильярду


14-1132587990
oldman
2005-11-21 18:46
2005.12.11
Вот тебе и раз...


2-1133092617
Eksell
2005-11-27 14:56
2005.12.11
Поиск файлов


9-1121962924
Conferno
2005-07-21 20:22
2005.12.11
Капризы Shadow Volume (GLScene)


14-1132662465
syte_ser78
2005-11-22 15:27
2005.12.11
есть ли прога помечающая беды на сд-рв?