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

Вниз

Можно ли 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 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.071 c
4-1080746515
_san_
2004-03-31 19:21
2004.05.16
Запуск внешнего приложения


1-1083322967
Amid
2004-04-30 15:02
2004.05.16
Ошибка при читении функции из DLL


14-1083052292
Slon_SCG
2004-04-27 11:51
2004.05.16
Автоматическое восстановление БД InterBase после сбоя


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


9-1073339831
$iD
2004-01-06 00:57
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский