Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.008 c
7-19003
Dann
2001-11-02 02:15
2002.02.07
Памогите пожалуйсто . Как узнать общее количество установленной и свободной оперативной память?


14-18991
Sir Alex
2001-12-14 19:59
2002.02.07
Новый клиент DMFC 1.0.005a + Исходники


7-19008
Poroh
2001-10-24 02:57
2002.02.07
Подскажите, пожалуйста, как перехватить сообщение о том, что программа выполнила недопустимую операцию и будет закрыта.


1-18828
olegd
2002-01-25 18:44
2002.02.07
ПОМОГИТЕ


6-18938
ZserG
2001-11-18 02:23
2002.02.07
Как вставить инструментальную панель в Explorer?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский