Форум: "WinAPI";
Текущий архив: 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))
обычно приводил к краху эксплорера :(
а все остальное - работает...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.02.07;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.005 c