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




Вниз

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))
обычно приводил к краху эксплорера :(
а все остальное - работает...





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




Наверх





Память: 0.77 MB
Время: 0.021 c
3-18726           KMZ                   2002-01-10 11:24  2002.02.07  
Масиера подскажите плиз,отчего возникает ошибка типа Access violation


14-18953          gun19456              2001-12-16 15:51  2002.02.07  
Где найти хороший бесплатный хостинг для размещения программ ?


1-18804           zool                  2002-01-24 20:27  2002.02.07  
Компоненты


6-18945           Hawk                  2001-11-13 18:49  2002.02.07  
Connect между TServerSocket и TClientSocket по сети


7-19014           SAlex                 2001-08-01 16:11  2002.02.07  
Производитель, дата и версия BIOS