Главная страница
    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.47 MB
Время: 0.035 c
6-1080241768
3APA3A
2004-03-25 22:09
2004.05.16
На отправляющий сокет приходит инфа, хотя приходить не должна...


3-1082561117
mur
2004-04-21 19:25
2004.05.16
ещё раз про поиск через SQL


7-1080470003
_dEMOn
2004-03-28 14:33
2004.05.16
Порты


1-1083221665
Yuri2004
2004-04-29 10:54
2004.05.16
Проблема с Interface ом


1-1083610229
apel
2004-05-03 22:50
2004.05.16
использование модуля на С++





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский