Главная страница
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.03 c
1-1083144254
Koliaff
2004-04-28 13:24
2004.05.16
Распечатка PaintBox.


14-1083208481
тихий вовочка
2004-04-29 07:14
2004.05.16
Ole


14-1082986341
Карелин Артем
2004-04-26 17:32
2004.05.16
Посоветуйте гамалку - драку реактивную.


3-1082632889
Draught
2004-04-22 15:21
2004.05.16
как получить эти данные


3-1081826210
johnny
2004-04-13 07:16
2004.05.16
Lookup поля