Форум: "WinAPI";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
ВнизСвязь с порождаемым процессом Найти похожие ветки
← →
shake-c (2006-07-19 12:00) [0]Всем добрый день !!
Вопрос такой: Порождается дочерний процесс (Create process),
Дочерний процесс в процессе работы должен "посылать" сигналы (данные) основному процессу. Как лучше реализовать
обработку принятых данных и приём?
Дочерние процессы создаются не на Delphi. И в их исходник
желательно вносить поменьше дополнений
Заранее большое спасибо
← →
medved_68 © (2006-07-19 12:21) [1]
> Дочерний процесс в процессе работы должен "посылать" сигналы
> (данные) основному процессу. Как лучше реализовать
> обработку принятых данных и приём?
Если процесс дочерний то сигнализировать о приеме данных установкой события и передачей указателя на область памяти где эти данные лежат.
← →
GrayFace © (2006-07-19 19:01) [2]Например, MMF+мьютекс. Если у дочернего процесса предполагается наличие окон, то можно организовать обмен на сообщениях. Вариантов много, мало только информации, особенно для ответа про обработку принятых данных.
medved_68 © (19.07.06 12:21) [1]
передачей указателя на область памяти где эти данные лежат
Чушь. Почитай про адресные пространства.
← →
Leonid Troyanovsky © (2006-07-19 23:17) [3]
> shake-c (19.07.06 12:00)
> Дочерний процесс в процессе работы должен "посылать" сигналы
> (данные) основному процессу. Как лучше реализовать
Если дочерние процессы используют станд. ввод/вывод,
то можно передать им хендлы anonymous pipe(s).
--
Regards, LVT.
← →
Slym © (2006-07-20 04:59) [4]Если дочка консольная... Лучше StdIn/Out ничего не создали
в CreateProcess пайпы передай дочка будет их юзать вместо консоли... в главном приложении ReadFile/Writefile
← →
GrayFace © (2006-07-21 00:42) [5]Ошибся - MMF + мьютекс недостаточно. Нужно MMF + 2 события.
← →
shake (2006-07-25 06:35) [6]
> Если у дочернего процесса предполагается наличие окон, то
> можно организовать обмен на сообщениях.
У дочерних процессов предполагается наличие окон. Как организовать обмен на сообщениях ? Может быть у кого то есть примеры, буду очень признателен.
← →
Slym © (2006-07-25 06:44) [7]В демках Demos\Ipcdemos
← →
Джо © (2006-07-25 06:47) [8]> [6] shake (25.07.06 06:35)
>
> > Если у дочернего процесса предполагается наличие окон,
> то
> > можно организовать обмен на сообщениях.
>
> У дочерних процессов предполагается наличие окон. Как организовать
> обмен на сообщениях ? Может быть у кого то есть примеры,
> буду очень признателен.
Для таких целей предназначено сообщениеWM_COPYDATA.
Сейчас уже недосуг написать простой пример или даже выдрать что-то из готовых исходников. Думаю, слегка погуглив по названию сообщения, минут за 10 найдешь пример и сам :)
← →
user51 (2006-07-25 15:46) [9]Нашел пример:
Функция посылает окну строку (с дополнительным любым числом) синхронно через WM_COPYDATA. Можно и другому приложению.
function SendIPCString(TargetWnd, SourceWnd: THandle;
dwData: integer; const S: string): integer;
var CD: TCopyDataStruct;
begin
CD.dwData := dwData; CD.cbData := Length(S);
if CD.cbData = 0 then CD.lpData := NIL else CD.lpData := @S[1];
Result := SendMessage(TargetWnd, WM_COPYDATA, SourceWnd, integer(@CD));
end;
а в принимающей программе какой код должен быть ???
ПОМОГИТЕ если знаете. Или дайте какой нибудь пример
P.S. если б знал не спрашивал.
← →
shake (2006-08-01 13:12) [10]я наткнулся на такой код:
// Sender: Send data
procedure TForm1.Button1Click(Sender: TObject);
var
aCopyData: TCopyDataStruct;
hTargetWnd: HWND;
begin
with aCopyData do
begin
dwData := 0;
cbData := StrLen(PChar(Edit1.Text)) + 1;
lpData := PChar(Edit1.Text)
end;
// Search window by the window title
hTargetWnd := FindWindowEx(0, 0, nil, PChar(′WM_COPYDATA-Receiver′));
if hTargetWnd <> 0 then
SendMessage(hTargetWnd, WM_COPYDATA, Longint(Handle), Longint(@aCopyData))
else
ShowMessage(′No Recipient found!′);
end;
(* -------------------------------------------------------------------- *)
// Recipient - Receive data
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
public
{ Public declarations }
end;
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var
sText: array[0..99] of Char;
begin
// generate text from parameter
StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData);
// write received text
label1.Caption := sText;
end;
Но тут не понянто как вызывать последнюю процедуру -
с какими параметрами ? Если кто знает подскажите пожалуйста
← →
Сергей М. © (2006-08-01 13:16) [11]
> shake (01.08.06 13:12) [10]
> не понянто как вызывать последнюю процедуру
Какую такую "последнюю" ? procedure TForm1.WMCopyData - эту что ли ?
Это не процедура, а метод объекта.
Вызывать ее не надо - она будет вызвана и без твоего участия.
← →
GrayFace © (2006-08-02 03:48) [12]Конкретно, она будет вызвана, если окну прийдет сообщение WM_COPYDATA.
← →
shake (2006-08-02 06:25) [13]Все понял. у меня был косяк в строке
hTargetWnd := FindWindowEx(0, 0, nil, PChar("WM_COPYDATA-Receiver"));
тут главное вместо "WM_COPYDATA-Receiver" правильный кэпшен формы-
получателя задать.
Теперь все заработало. Всем спасибо 8 )
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.043 c