![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача массива между приложениями
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, хотя, лучше было бы огранизовать нормальное межпроцессное взаимодействие.