Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.023 c
11-1113674934
Dot
2005-04-16 22:08
2005.12.11
VCL, KOLForm & uses mirror


14-1132647302
злобная танька
2005-11-22 11:15
2005.12.11
Посоветуйте книжку по VC++ или как там его


1-1131544941
Суслик
2005-11-09 17:02
2005.12.11
Runtime пакеты


8-1121087757
izvr
2005-07-11 17:15
2005.12.11
Проигрывание видеофайлов без остановок


1-1132066940
Erik1
2005-11-15 18:02
2005.12.11
Как недопустить изменение размеров Midi форм?




   Наверх