Форум: "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.035 c