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

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

Передача массива между приложениями


GEN++ ©   (2007-01-27 13:11:00) 

Мне нужно предать 128 слов данных из одного париложения в
другое. Указатель на глобальный массив приложения1 передаю
в прилодение 2 через SendMessage. Численно принятый указатель совпадает с отправленным, а вот данные не
совпадают. Прошу помочь среализацией или примером.
Заранее спасибо.


_SuN_   (2007-01-28 21:45:00) [1]

podderzivaju FileMapping))


Zeqfreed   (2007-01-28 01:12:00) [2]

> GEN++ ©   (27.01.07 22:37) [10]

Насколько я помню, там нужно передавать дескриптор процесса. В справке же должно быть написано :)


antonn   (2007-01-28 00:42:00) [3]

я правда не все повырезал, но думаю смысл будет понятен:) В HandleWind должен быть хендл окна "приемника"


antonn   (2007-01-28 00:41:00) [4]


type
TWindowStick = record
 x:integer;
end;

TForm
private
procedure ReceiveMessage (var Msg: TWMCopyData); message WM_COPYDATA;

...


отправляем
var cd:TCopyDataStruct; WindowStick:TWindowStick; ms: TMemoryStream;
begin
if HandleWind<>0 then begin

ms:=TMemoryStream.Create;
try
WindowStick.x:=10; //это просто структура для примера
ms.Write(WindowStick,sizeof(WindowStick));
with cd do begin
 dwData := 1;
 cbData := ms.Size;
 lpData := ms.Memory;
end;                                ///******
SendMessage(HandleWind, WM_COPYDATA, 500, Longint(@cd))

finally
ms.Free;
end;
end;


принимаем
procedure TStickForm.ReceiveMessage(var Msg: TWMCopyData);
var pcd: PCopyDataStruct; s:String; ws:TWindowStick; _M:TMemoryStream;
begin
 pcd:=PCopyDataStruct(Msg.CopyDataStruct);

 if pcd.cbData=sizeof(TWindowStick) then begin
    _M:=TMemoryStream.Create;
  try
    with Msg.CopyDataStruct^ do
    _M.Write(lpdata^, cbdata);
    _M.Position:=0;
    _M.Read(ws,sizeof(TWindowStick));
    //все, вот и она структура - ws
  finally
   _M.free;
  end;

  exit;
 end;
end;


GEN++   (2007-01-28 00:12:00) [5]

А пример написать - никак не получается.


GEN++   (2007-01-28 00:11:00) [6]

*/


antonn   (2007-01-27 23:08:00) [7]

TStas ©   (27.01.07 14:59) [7]
А есть и уж совсем простой способ - через буфер обмена.

по рукам за такое:)


GEN++   (2007-01-27 22:37:00) [8]

>Zeqfreed
Что то не работает ReadProcessMemory
читает 0 байт:
в качестве 1-го параметра подставляю Application.Handle из которого
читаю (передаю через wParam sendMessage) или неправильно????


Loginov Dmitry   (2007-01-27 17:41:00) [9]

Используй FileMapping. Практически все способы межпроцессного взаимодействия основаны на этой технологии.


Zeqfreed   (2007-01-27 16:46:00) [10]

> Вам же надо массив строк передать.

Вообще-то, в [0] написано о 128 словах, про строки там ничего.


TStas   (2007-01-27 14:59:00) [11]

А есть и уж совсем простой способ - через буфер обмена. Вам же надо массив строк передать.


SergGG   (2007-01-27 14:31:00) [12]

> А кроме WM_COPYDATA других способов нет?
Есть много способов передачи данных:
-DDE
-Socet
-NetBIOS
-......

Наиболее простым является DDE (Есть готовые компоненты)


Olivetti   (2007-01-27 14:03:00) [13]

А я счтал что Heap для всех процессов одна

Это было давно и не правда.


GEN++   (2007-01-27 13:58:00) [14]

>Zeqfreed
ReadProcessMemory вроде бы должен сработать
А я счтал что Heap для всех процессов одна.


Zeqfreed   (2007-01-27 13:48:00) [15]

> колхоз глазами хакера   (27.01.07 13:46) [2]

А кроме WM_COPYDATA других способов нет?


колхоз глазами хакера   (2007-01-27 13:46:00) [16]

> [0] GEN++ ©   (27.01.07 13:11)
смотри в сторону WM_COPYDATA


Zeqfreed   (2007-01-27 13:27:00) [17]

Разумеется, не совпадают. Слышал что-нибудь о виртуальном адресном пространстве? Так вот, у каждого процесса оно свое. Могу предложить читать данные вторым процессом через ReadProcessMemory, хотя, лучше было бы огранизовать нормальное межпроцессное взаимодействие.


Наверх

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