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

Вниз

PostMessage   Найти похожие ветки 

 
YUS   (2001-12-10 19:08) [0]

Как с помощью функции PostMessage или SendMessage передать переменную String, (lParm и wParam) ведь integer. И как затем получить String переменную из (lParm и wParam) ? Спасибо.


 
Mick   (2001-12-10 19:10) [1]

Передай указатель на String, и все дела


 
YUS   (2001-12-10 19:19) [2]

А можно пример, как передать указатель на string.


 
Delirium ©   (2001-12-10 19:27) [3]


const MyMessage=WM_USER+2000;
...
procedure OnMyMessage(var Msg:TMessage); message MyMessage;
...
procedure TForm1.Button4Click(Sender: TObject);
var S:String;
begin
S:="Привет";
SendMessage(Handle,MyMessage,0,Integer(PChar(S)));
end;

procedure TForm1.OnMyMessage(var Msg:TMessage);
var S:String;
begin
S:=String(Msg.LParam);
ShowMessage(S);
end;


 
YUS   (2001-12-10 19:41) [4]

Спасибо!


 
Raptor ©   (2001-12-10 22:27) [5]

Привет!

2Delirium
Интересно, а изолированость адресных пространств ты не учитываешь. В этом примере, который ты привел, оно конечно работать будет, так как приложение шлет сообщение с адресом строки само себе. А ты пробовал также передавать строку между двумя независимыми приложениями? Попробуй.
Расскажешь потом чем это закончилось. :-))

Raptor.


 
paul_shmakov ©   (2001-12-11 01:58) [6]

не будем ждать результатов :) для передачи той же string в другое приложение нужно использовать сообщение WM_COPYDATA
Примерно так:

var
S: string; // наша строка
cds: COPYDATASTRUCT;
begin
S := "Какой-то текст";

cds.dwData := ????; // все, что угодно - на усмотрения программиста
cds.cbData := Length(S) + 1; // надо учесть, что в asciiz строке в конце символ chr(0)
cds.lpData := PChar(S);
SendMessage(hWnd, WM_COPYDATA, Form1.Handle, @cds);


система выделяет память, в которую копирует данные из cds.lpData размером cds.cbData.
в данном случае нельзя использовать PostMessage, т.к. сообщения от PostMessage обрабатываются асинхронно, и для системы будет проблематично освободить ту память, которую она отведет под передаваемые данные.


 
Mick   (2001-12-11 11:31) [7]

А если это приложение на другом компьютере выполняется ? Где будет ваше WM_COPYDATA?


 
Delirium ©   (2001-12-11 11:38) [8]

>paul_shmakov
>Mick
Вопрос-то был элементарный, такой и ответ, а следуя за вашими рассуждениями: от одного приложения другому, потом на другую машину, потом от одного ко многим, потом и-нет .... мы придём к общему вопросу передачи информации, который YUS, по моему, обсуждать не собирался.


 
Digitman ©   (2001-12-11 11:52) [9]

>Mick
А где ты вычитал, что SendMessage/PostMessage предназначены для посылки сообщений на другой компьютер ?


 
Mick   (2001-12-11 12:18) [10]

To Delirium: все нормально я не в твой огород камни бросал.
To Digitman: а откуда это становится ясно что я такое вычитал?


 
Digitman ©   (2001-12-11 13:38) [11]

>Mick
"А если это приложение на другом компьютере выполняется ? Где будет ваше WM_COPYDATA?" - твоя фраза ? Это из каких источников ты почерпнул и шлешь безадресно столь категоричный вопрос-утверждение, что SendMessage/PostMessage имеют какое-то отношение к сетевым взаимодействиям ?



 
Mick   (2001-12-11 14:44) [12]

To: Digitman проследи за ходом мысли:
1. Человек спросил, как с помощью SendMessage/PostMessage передать строку.
2. Ему честно ответили как.
3. Кто-то начинает говорить про защищенный режим i386 (хотя в вопросе другой процесс совсем не упоминался) и говорит что wm_copydata - самое то что надо.
4. Начинаю и я фантазировать на тему "что хотел автор вопроса" и спрашиваю то, что спросил.
5. Некто Digitman решает, что я пользуюсь wm_copydata для межпроцессного взаимодействия в сети.




 
panov ©   (2001-12-11 15:19) [13]

>Mick (11.12.01 14:44)
--------------------------
Mick (11.12.01 11:31)
А если это приложение на другом компьютере выполняется ? Где будет ваше WM_COPYDATA?

--------------------------


 
Digitman ©   (2001-12-11 15:32) [14]

>Mick
Сообщение , посланное приложению, которое "на другом компьютере выполняется" - это что, не сетевое взаимодействие компьютеров ?????


 
Mick   (2001-12-11 15:38) [15]

Ребята, извините меня, но не тупите.
После того, как paul_shmakov предположил, что речь идет о двух процессах и предложил wm_copydata, я, в свою очередь, предположил что процессы на разных тачках и спроил где будет ЕГО (не мое) сообщение wm_copydata. (По русски это звучит "Что вы будете делать с этим сообщением если процесс которому отсылается сообщение не на вашей машине, а на другой")

Надеюсь, вы наконец догнали что я хотел сказать?




 
nikkie ©   (2001-12-11 15:48) [16]

началась ругань...

>mick
ну ты тоже проследи за ходом дискуссии:
- YUS задает вопрос про SendMessage, где не сказано окну какого процесса посылается сообщение
- ты и Delirium даете правильный ответ в предположении, что посылается окну того же процесса
- Raptor и paul_shmakov указывают на то, что окну другого процесса строку можно передать с использованием WM_COPYDATA, ответ ли это на вопрос YUS? да. по-крайней мере это полезное дополнение к вашим ответам.
- ты начинаешь флейм с фантазиями на тему "разных тачек", что к SendMessage уже никакого отношение не имеет
- Digitman тебе говорит, что это к теме отношения не имеет
- а ты бычишься



 
Digitman ©   (2001-12-11 15:50) [17]

>Mick
Ты бы, уважаемый, не жаргоном щеголял ("тупите", "догнали"), а промолчал бы, тем самы продемонстрировав понимание того, что, когда речь идет о SendMessage/PostMessage, то речь идет ОДНОЗНАЧНО о интерпроцессном взаимодействии в рамках одной и той же ОС, а не о сетевом взаимодействии в распределенных системах.


 
Mick   (2001-12-11 15:59) [18]

Рад что наконец-то мы поняли друг друга.
Кстати жаргон появился только после нескольких безуспешных попыток общения на русском языке.


 
Digitman ©   (2001-12-11 16:09) [19]

>Mick
Применение жаргона (тем более непрофессионального - дворового, доморощенного) никак не оправдано в вирт.общении, применяя его ты демонстрируешь элементарное дилетантство в профессиональном диалоге. Не грех не владеть в полной мере проф.сленгом, но жаргон - это не сленг, это неуважение к оппоненту.


 
Mick   (2001-12-11 16:16) [20]

Понимание русского и обладание здоровым чувством юмора не менее важно.
Я с Вами с самого начала разговаривал без всякого жаргона, заметьте.


 
Digitman ©   (2001-12-11 16:28) [21]

>Mick
Ок.


 
YUS   (2001-12-11 16:46) [22]

Ну Вы ребята даете. Спасибо конечно всем.
Я установил хук в explarer и пытаюсь передать имена и координаты ярлыков.
Способ Delirium в моем случае не работает, хотя если s:="привет" работает.
Скорее всего ошибка в ф-ции ListView_GetItemText. Но какая?? Может подскажите,еще разок. ( только не ругайтесь.)

function kView:string;
var
nItems:cardinal; //номер ярлыка
TextToSet: PChar; S:String;
p:TPoint; buffer: array [0..127] of char; Item:integer;
begin
p.x:=0; p.y:=0;
nItems:=ListView_GetItemCount(hStol);
for Item:= 1 to nItems do
begin
ListView_GetItemPosition(hStol,Item,p);
ListView_GetItemText(hStol,Item,0,buffer,sizeof(buffer));
s:=buffer;;
SendMessage(findwindow(nil,PChar("Form1")),WM_IPoint, p.x,p.y);
SendMessage(findwindow(nil,PChar("Form1")), WM_IName, 0, Integer(PChar(S)));
Принемаю сообщения

procedure TForm1.OnMyMessage(var Msg:TMessage);
var S:String;
begin
S:=String(Msg.LParam);
ShowMessage(S);
end;


 
Bachin   (2001-12-11 18:51) [23]

если имеется ввиду Desktop, то у меня траблы были с
ListView_GetItemPosition(hStol,Item,p)...
точнее
SendMessage(HDLV, LVM_GETITEMPOSITION, 1, Cardinal(ip))
обычно приводил к краху эксплорера :(
а все остальное - работает...





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

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

Наверх




Память: 0.52 MB
Время: 0.008 c
1-18797
Super_Drive
2002-01-24 16:58
2002.02.07
Проблема с Chart


3-18765
mursik
2002-01-12 21:42
2002.02.07
Индексы CDX


6-18944
volodya
2001-11-14 16:33
2002.02.07
Как получить доступ по локальной сети к реестру и редактировать его


14-18986
programmer1
2001-12-19 21:28
2002.02.07
Совместимость 5й и 4й версий дельфи и назначение rx units


14-18974
borisich
2001-12-19 14:50
2002.02.07
У кого-нибудь есть русификация InstallShield Express?