Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Можно ли c помощью SendMessage передавать строку   Найти похожие ветки 

 
i-s-v   (2004-03-19 22:59) [0]

Здрасте, люди!
Можно ли при помощи функции SendMessage (или какой-то другой, которая отсылает сообщения) передавать в качестве одного из параметров строку? Если да, то как?
Заранее благодарен.


 
Игорь Шевченко ©   (2004-03-19 23:18) [1]

В свое приложение можно как угодно, в том числе своими сообщениями.

const UM_MYMESSAGE = WM_USER + 10;

SendMessage(MyForm.Handle, UM_MYMESSAGE, 0, LPARAM(PChar(Str)));
например.

В MyForm должен быть обработчки этого сообщения, который знает, что делать со строкой.

В чужое приложение можно специальными сообщениями, например WM_SETTEXT или WM_COPYDATA.


 
Алхимик ©   (2004-03-19 23:22) [2]

VAR S : ARRAY[0..40] OF Char;
...
StrCopy(S, "Путин - президент, децл - лох");
SendMessage(<дескриптор окна>, <сообщение WM...>, 0, LongInt(@S));


 
i-s-v   (2004-03-20 00:53) [3]

Спасибо!


 
Германн ©   (2004-03-20 01:16) [4]

2 Игорь Шевченко ©   (19.03.04 23:18) [1]
А нужно ли в свем приложении преобразование PChar(Str)?

2 Алхимик ©   (19.03.04 23:22) [2]
А при передаче в чужое приложение вариант не пройдет, несмотря на верноподданческие мотивы и отрицание масс-культуры! :))


 
Игорь Шевченко ©   (2004-03-20 01:18) [5]

Германн ©   (20.03.04 01:16)


>  нужно ли в свем приложении преобразование PChar(Str)?

Нужно.


 
Германн ©   (2004-03-20 02:18) [6]

2 Игорь Шевченко ©   (20.03.04 01:18) [5]
Если не сложно. А для чего?


 
Игорь Шевченко ©   (2004-03-20 12:50) [7]

Германн ©   (20.03.04 02:18)

Вопрос конечно интересный: Пришлось написать простенькое приложение, чтобы обнаружить, что, оказывается, не так уж и обязательно выполнять преобразование PChar(S).

С другой стороны, в непростеньких проектах встречается это преобразование, наверное, неспроста, вполне могли быть какие-то подводные камни, о которых я сейчас не вспомню. Так что вопрос остается открытым.


 
Artog   (2004-03-20 16:05) [8]

По дефолту в delphi включена директива {$H+}, которая преобразует все строки в nullterminate строки, поэтому отпадает необходимость вызова PChar. Попробуйте сделать {$H-} и передать строку в API функцию, думаю что ничего хорошего не получится.


 
Германн ©   (2004-03-20 17:39) [9]

2 Artog   (20.03.04 16:05) [8]

А какая разница? И так и этак передается в LParam указатель. А на что он указывает без разницы, если на приемном конце известно что это. Кроме того никто не говорил о передаче строки в API функцию.


 
Ihor Osov'yak ©   (2004-03-21 18:27) [10]

в дополнение Игорь Шевченко ©   (20.03.04 12:50) [7]

Не поленился, посмотрел сгенерированный компилятором код.
Разница между
  SendMessage(Handle, WM_User, 0, LPARAM(PChar(s)));
и
  SendMessage(Handle, WM_User, 0, LPARAM(s));

в том, что в первом случае вызывается LStrToPChar, во втором - нет (D4, установки компилятора по дефолту, проверил также в D6 - ситуация аналогична)..

LStrToPChar  примечателен тем, что nil преобразовывает в указатель на байт, в котором есть 0. Но поскольку при использовании "чистого" паскаля нельзя скомпилировать  s := nil;
s здесь string, то PChar здесь - обычная перестраховка..
Хотя бы от шедевра типа

  i := 0;
  Move(i, s, sizeof(pointer));

И то, катострофичен ли по последствиям этот шедевр - это будет зависить от реализации обработчика сообщения.. Можно сделать и такую реализацию, что как раз передача nil расценивается допустимой, а вот подмена nil на поинтер, смотрящий на нулевой байт - может стать для программера некоторой неожиданностью..

Зы. Хотя я бы лично написал-бы все же

SendMessage(Handle, WM_User, 0, LPARAM(PChar(s))); - сила привычки и нелюбовь к неявным преобразованиям..


 
Германн ©   (2004-03-23 01:22) [11]

2 Игорь Шевченко ©   (20.03.04 12:50) [7]
Да, вопрос действительно остается открытым.

2 Ihor Osov"yak ©   (21.03.04 18:27) [10]
Ваши доводы понятны. Но они не учитывают того факта, что может быть установлено {$H-}.
Т.е. корректная передача строки (да и не только строки, а вообще чего-либо) через Message.LParam, имхо, должна обязательно подразумевать, что обработчик данного сообщения точно знает, что ему было передано в LParam. А в таком случае зачем какие-либо преобразования типа перед посылкой?


 
i-s-v   (2004-03-27 01:56) [12]

2 ALL
Все это, конечно, хорошо, но нельзя ли примерчик для WM_COPYDATA?
А то какая-то муть получается вместо строки...

procedure TForm1.WMCOPYDATA;
var
 cds: PCOPYDATASTRUCT;
 p: PChar;
begin
 cds := Pointer(m.LParam);
 lstrcpy(p, cds.lpData);
 
//p := cds.lpData;
 if p <> nil
   then ShowMessage(p);
end;



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

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
1-1083141363
Tsvetkov A.V.
2004-04-28 12:36
2004.05.16
Потоки в ДЛЛ


3-1082345098
Orange
2004-04-19 07:24
2004.05.16
Сохранение базы данных


1-1083300607
ZDDR
2004-04-30 08:50
2004.05.16
Images


14-1082699749
snake1977
2004-04-23 09:55
2004.05.16
Порты


1-1082970081
HarryP
2004-04-26 13:01
2004.05.16
Unicode