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

Вниз

Проблема получением сообщения WM_COPYDATA, Проблема с аглоритмом   Найти похожие ветки 

 
Жэня   (2010-03-12 22:24) [0]

Собственно задача
Нужно отправить определённой программе команду с помощью SendMessage(WM_CopyData), дождаться пока прийдёт ответ от нее (тоже она отправляет с помощью WMCopyData и SendMessage) и возвращитить его как резалт функции. Это конечно можно сделать асинхронно всё. Т.е. отправил команду. Потом получил ответ в оконную функцию и запустил нужную функцию или присвоил его переменной какой-то. Но хотелось бы как. Из любого места в программе вызвал функцию
MYSENDCOMMAN("тут команда") и она возвратила результат который ей пришел от другой программы. Реально ли этол вообще сделать?

Пытался сделать так. в MYSENDCOMMAN отправляю сообщение, потом делаю бесконечный цыкл где происходит application.processmessage который обрываеться когда приходит WM_CopyData в оконную функцию. Только вот проблема что в оконную функцию это сообщение уже не приходит так капк подозреваю что цыкл который бесконечный с application.processmessage недает этому свершиться. Может знает кто-то как вообще можно это реализовать?...


 
DVM ©   (2010-03-12 23:07) [1]


> Жэня   (12.03.10 22:24) 

для обмена данными между процессами есть множество методов:
1) Сообщения
2) Сокеты
3) Именованные каналы
4) Файлы отображенные в память
5) Майлслоты всякие
6) DCOM

Сообщения не лучший способ в твоем случае


 
DVM ©   (2010-03-12 23:09) [2]


> MYSENDCOMMAN("тут команда") и она возвратила результат который
> ей пришел от другой программы. Реально ли этол вообще сделать?
>

что из себя представляет результат? Если целое число, то SendMessage как раз это и позволит сделать.


 
Жэня   (2010-03-12 23:54) [3]

ну тут спецификация такая что нужно именно сообщениями
поэтому других вариантов нету

да, я вкурсе что sendmessage возвращает результат, тольво вот он не integer и нужно именно получить резалт что шлёт программа через wm_copydata


 
DVM ©   (2010-03-13 00:04) [4]


> Жэня

Две посылки WM_COPYDATA всегда будут асинхронны. Одной WM_COPYDATA тоже не обойдешься, т.к принимающая сторона не может менять данные в сообщении.
Если уж приспичило именно сообщениями, то может их использовать в паре с MMF


 
Жэня   (2010-03-13 00:09) [5]

ну тут нето чтобы приспичило, вторая прога это третья разработка и она так работает.//


 
DVM ©   (2010-03-13 00:11) [6]


> Жэня   (13.03.10 00:09) [5]

Сделать из асинхронного синхронное конечно всегда можно, но надо ли? Это как корове седло.


 
Rouse_ ©   (2010-03-13 00:30) [7]

Если нельзя, но все-же очень хочется, то можно. Пусть принимающая сторона на SendMessage возвращает хэндл выданный GlobalAlloc, откуда можно будет прочитать результирующие данные.


 
Игорь Шевченко ©   (2010-03-13 00:39) [8]


> Пусть принимающая сторона на SendMessage возвращает хэндл
> выданный GlobalAlloc, откуда можно будет прочитать результирующие
> данные.


Из другого процесса ?


 
Rouse_ ©   (2010-03-13 00:40) [9]

Ну и вот это конечно очень сильно удивило:

> вкурсе что sendmessage возвращает результат, тольво вот
> он не integer


 
Rouse_ ©   (2010-03-13 00:47) [10]


> Игорь Шевченко ©   (13.03.10 00:39) [8]
>
>
> > Пусть принимающая сторона на SendMessage возвращает хэндл
> > выданный GlobalAlloc, откуда можно будет прочитать результирующие
> > данные.
>
>
> Из другого процесса ?

А это проблемма?


 
Жэня   (2010-03-13 00:51) [11]

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

В любом случае решил уже проблему.
ReplyMessage(1); спасла, просто вызывался цыкл в оконной функции и небыло ответа на сообщение, поэтому не слались другие. Всем спасибо


 
Игорь Шевченко ©   (2010-03-13 01:11) [12]

Rouse_ ©   (13.03.10 00:47) [10]

Возвратить Handle, полученный по GloballAlloc в другом процессе - не проблема.

Прочитать данные оттуда представляется проблемой, нет ? Как-то до сих пор не приходилось слышать об обмене между процессами по Handle GlobalAlloc, все больше через MMF.

У меня такой пробел в образовании ?


 
Rouse_ ©   (2010-03-13 01:26) [13]


> Игорь Шевченко ©   (13.03.10 01:11) [12]
> У меня такой пробел в образовании ?

Стесняюсь спросить, CreateStreamOnHGlobal работает только в рамках твоего процесса?


 
Игорь Шевченко ©   (2010-03-13 01:32) [14]

Rouse_ ©   (13.03.10 01:26) [13]

Ты не стесняйся, ты лучше код приведи, когда один процесс выделяет память по GlobalAlloc, передает этот HGlobal в другой процесс, а другой эту память использует. Хотя бы через CreateStreamOnHGlobal, или через GlobalLock + чтение/запись


 
Германн ©   (2010-03-13 01:39) [15]


> Rouse_ ©   (13.03.10 01:26) [13]


> Игорь Шевченко ©   (13.03.10 01:32) [14]

Бедн(ый)ая Жэня.
Он(а) совсем о другом спрашивал(а).
(((


 
Rouse_ ©   (2010-03-13 12:18) [16]


> Игорь Шевченко ©   (13.03.10 01:32) [14]
>
> Rouse_ ©   (13.03.10 01:26) [13]
>
> Ты не стесняйся, ты лучше код приведи

Хм, мдя, что-то я зарапортовался, глядя на код своего снапина :)
Ну тогда вот так:

Отправляющая сторона:
procedure TForm2.Button1Click(Sender: TObject);
var
 P: PDWORD;
 CDS: TCopyDataStruct;
begin
 CDS.dwData := GetCurrentProcessId;
 CDS.cbData := 0;
 CDS.lpData := nil;
 P := PDWORD(SendMessage(StrToInt(Edit1.Text),
   WM_COPYDATA, Handle, Integer(@CDS)));
 if P <> nil then
 begin
   ShowMessage(IntToHex(P^, 8));
   VirtualFree(P, 4, MEM_RELEASE);
 end;
end;


Принимающая сторона:
type
 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
 private
   procedure Foo(var Message: TWMCopyData); message WM_COPYDATA;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Foo(var Message: TWMCopyData);
var
 P: Pointer;
 Data: DWORD;
 hProc: THandle;
 lpNumberOfBytesWritten: DWORD;
begin
 Data := $DEADBEEF;
 Message.Result := 0;
 hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE, False,
   Message.CopyDataStruct^.dwData);
 if hProc <> 0 then
 try
   P := VirtualAllocEx(hProc, nil, 4, MEM_COMMIT, PAGE_READWRITE);
   WriteProcessMemory(hProc, P, @Data, 4, lpNumberOfBytesWritten);
   if lpNumberOfBytesWritten = 4 then    
     Message.Result := Integer(P);
 finally
   CloseHandle(hProc);
 end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Caption := IntToStr(Handle);
end;



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

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

Наверх




Память: 0.51 MB
Время: 0.006 c
15-1372770167
Jeer
2013-07-02 17:02
2013.12.22
Вело-отдых


15-1372932417
Empleado
2013-07-04 14:06
2013.12.22
Программист: берегись!


15-1372969802
Юрий
2013-07-05 00:30
2013.12.22
С днем рождения ! 5 июля 2013 пятница


15-1373229002
Юрий
2013-07-08 00:30
2013.12.22
С днем рождения ! 8 июля 2013 понедельник


15-1372669325
Дмитрий СС
2013-07-01 13:02
2013.12.22
Альтернатива Яндекс.Музыки.