Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизПередача массива между приложениями Найти похожие ветки
← →
GEN++ © (2007-01-27 13:11) [0]Мне нужно предать 128 слов данных из одного париложения в
другое. Указатель на глобальный массив приложения1 передаю
в прилодение 2 через SendMessage. Численно принятый указатель совпадает с отправленным, а вот данные не
совпадают. Прошу помочь среализацией или примером.
Заранее спасибо.
← →
Zeqfreed © (2007-01-27 13:27) [1]Разумеется, не совпадают. Слышал что-нибудь о виртуальном адресном пространстве? Так вот, у каждого процесса оно свое. Могу предложить читать данные вторым процессом через ReadProcessMemory, хотя, лучше было бы огранизовать нормальное межпроцессное взаимодействие.
← →
колхоз глазами хакера (2007-01-27 13:46) [2]> [0] GEN++ © (27.01.07 13:11)
смотри в сторону WM_COPYDATA
← →
Zeqfreed © (2007-01-27 13:48) [3]> колхоз глазами хакера (27.01.07 13:46) [2]
А кроме WM_COPYDATA других способов нет?
← →
GEN++ © (2007-01-27 13:58) [4]>Zeqfreed
ReadProcessMemory вроде бы должен сработать
А я счтал что Heap для всех процессов одна.
← →
Olivetti (2007-01-27 14:03) [5]А я счтал что Heap для всех процессов одна
Это было давно и не правда.
← →
SergGG © (2007-01-27 14:31) [6]> А кроме WM_COPYDATA других способов нет?
Есть много способов передачи данных:
-DDE
-Socet
-NetBIOS
-......
Наиболее простым является DDE (Есть готовые компоненты)
← →
TStas © (2007-01-27 14:59) [7]А есть и уж совсем простой способ - через буфер обмена. Вам же надо массив строк передать.
← →
Zeqfreed © (2007-01-27 16:46) [8]> Вам же надо массив строк передать.
Вообще-то, в [0] написано о 128 словах, про строки там ничего.
← →
Loginov Dmitry © (2007-01-27 17:41) [9]Используй FileMapping. Практически все способы межпроцессного взаимодействия основаны на этой технологии.
← →
GEN++ © (2007-01-27 22:37) [10]>Zeqfreed
Что то не работает ReadProcessMemory
читает 0 байт:
в качестве 1-го параметра подставляю Application.Handle из которого
читаю (передаю через wParam sendMessage) или неправильно????
← →
antonn © (2007-01-27 23:08) [11]TStas © (27.01.07 14:59) [7]
А есть и уж совсем простой способ - через буфер обмена.
по рукам за такое:)
← →
GEN++ (2007-01-28 00:11) [12]*/
← →
GEN++ (2007-01-28 00:12) [13]А пример написать - никак не получается.
← →
antonn © (2007-01-28 00:41) [14]
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;
← →
antonn © (2007-01-28 00:42) [15]я правда не все повырезал, но думаю смысл будет понятен:) В HandleWind должен быть хендл окна "приемника"
← →
Zeqfreed © (2007-01-28 01:12) [16]> GEN++ © (27.01.07 22:37) [10]
Насколько я помню, там нужно передавать дескриптор процесса. В справке же должно быть написано :)
← →
_SuN_ (2007-01-28 21:45) [17]podderzivaju FileMapping))
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c