Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PostMessage [D5, Win95/98]


Страницы:   1 2

YUS ©   (2001-12-10 19:08:00) 

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


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

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



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

Ну Вы ребята даете. Спасибо конечно всем.
Я установил хук в 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;


Digitman   (2001-12-11 16:28:00) [3]

>Mick
Ок.


Mick   (2001-12-11 16:16:00) [4]

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


Digitman   (2001-12-11 16:09:00) [5]

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


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

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


Digitman   (2001-12-11 15:50:00) [7]

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


nikkie   (2001-12-11 15:48:00) [8]

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

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


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

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

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



Digitman   (2001-12-11 15:32:00) [10]

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


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

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

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


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

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



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

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


Mick   (2001-12-11 12:18:00) [14]

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


Digitman   (2001-12-11 11:52:00) [15]

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


Delirium   (2001-12-11 11:38:00) [16]

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


Mick   (2001-12-11 11:31:00) [17]

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


paul_shmakov   (2001-12-11 01:58:00) [18]

не будем ждать результатов :) для передачи той же 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 обрабатываются асинхронно, и для системы будет проблематично освободить ту память, которую она отведет под передаваемые данные.


Raptor   (2001-12-10 22:27:00) [19]

Привет!

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

Raptor.


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

Спасибо!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо