Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Вниз

Отсылка сообщений   Найти похожие ветки 

 
dzr_gregory   (2007-10-21 14:12) [0]

Всем доброго времени суток. У меня такая проблема - необходимо в программе через SendMessage() отправить сообщение самому себе. Делаю так:
1. Объявляю константы сообщения:

const
 WM_MY_MESSAGES = WM_USER + 1983;
 MSG_ADD2LOG = WM_MY_MESSAGES + 1;

2. Декларирую обработчик в главной форме приложения:

   // Мои обработчики событий
   procedure OnMsg_ADD2LOG(var Msg: TMessage); message MSG_ADD2LOG;

3. Мне необходимо отправить сообщение с неким параметром, в данном случае это указатель на строку pChar. Делаю так:

var
 ErrMsg: string;
 pErr: pChar;
begin
 pErr := "123";
 SendMessage(Handle, MSG_ADD2LOG, 0, Integer(@pErr));

4. В обработчике OnMsg_ADD2LOG пишу:

procedure TfrmMain.OnMsg_ADD2LOG(var Msg: TMessage);
var
 pErr: PChar;
begin
 ShowMessage("da da da!!!");
 pErr := PChar(Pointer(Msg.LParam)^);
 ShowMessage(pErr);
end;


Вопрос: правомерна ли такая передача параметра, не будет ли утечки памяти (ведь созданная строка не освобождается), правильно ли передавать указатель на локальную переменную, память под которую будет освобождена при выходе из функции?


 
Однокамушкин   (2007-10-21 14:37) [1]

В данном случае правомерна, потому что для литерала "123" выделяется память в сегменте кода, и эта память никогда не освобождается, а переменная pErr будет просто указывать на эту область в сегменте кода... Вот если вы переменной не литерал присвоите, а что-то другое, тогда, возможно, надо будет освобождать память, но это уже надо конкретно смотреть, что и как вы присваиваете

Только не понимаю, зачем вам указатель на указатель - всё делается проще
SendMessage(Handle, MSG_ADD2LOG, 0, Integer(pErr));

pErr := PChar(Msg.LParam);


 
Reindeer Moss Eater ©   (2007-10-21 14:47) [2]

Sendmessage никак не влияет на то, будет ли утечка или нет.


 
dzr_gregory   (2007-10-21 14:57) [3]

А если отправка будет происходить с помощью PostMessage? Допустим я сделаю так: Зарезервирую память под переменную, сделаю PostMessage отправив указатель на переменную, тут же освобожу ее. Где гарантия, что событие обработается раньше чем освободится память?


 
Reindeer Moss Eater ©   (2007-10-21 14:58) [4]

Нет гарантии. Но и утечки из-за постмессадж тоже не будет.


 
DVM ©   (2007-10-21 15:15) [5]


> сделаю PostMessage отправив указатель на переменную, тут
> же освобожу ее. Где гарантия, что событие обработается раньше
> чем освободится память?

Так скорее всего и не будет. Получишь свой AV заслуженный. Либо освобождай там где получил сообщение, либо SendMessage


 
dzr_gregory   (2007-10-21 15:29) [6]

В общем, резюме. Приведенный код имеет право на жизнь лишь в случае SendMessage. Просто у меня в приложении будет n потоков, которые будут добавлять записи в лог, и я подумал что SendMessage будет весьма кстати...


 
Однокамушкин   (2007-10-21 16:25) [7]


> dzr_gregory   (21.10.07 15:29) [6]

Нет, резюме немножео не такое... Можно, например, в одной нити вызывать StrNew для формирования строки, отправлять этот указатель через PostMessage и забывать про него, а StrDispose вызывать уже в обработчике этого сообщения... Память не обязательно освобождать в той же нити, в которой она была выделена


 
dzr_gregory   (2007-10-23 10:36) [8]


> Нет, резюме немножео не такое... Можно, например, в одной
> нити вызывать StrNew для формирования строки, отправлять
> этот указатель через PostMessage и забывать про него, а
> StrDispose вызывать уже в обработчике этого сообщения...
>  Память не обязательно освобождать в той же нити, в которой
> она была выделена

Хмм... Тоже можно.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.07.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.038 c
2-1213811159
leonidus
2008-06-18 21:45
2008.07.20
Как скрыть гоавную форму приложения при старте


11-1191960858
ElectriC
2007-10-10 00:14
2008.07.20
Проблема с KeyPreview


2-1213953724
Виктор
2008-06-20 13:22
2008.07.20
Запись графики в базу MS SQL


2-1213984177
Res
2008-06-20 21:49
2008.07.20
exit и procedure


2-1213877006
Гость
2008-06-19 16:03
2008.07.20
TNT компонент и Clipboard





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский