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

Вниз

DLL для связи двух программ   Найти похожие ветки 

 
MaxxSoft ©   (2006-03-24 11:52) [0]

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

procedure P_PUSK_CALL(WPWnd: HWND);
var
 CashierWnd,
 NewWnd: HWND;
 WC: TWndClass;
 // Процедура обработки сообщений создаваемого окна
 function WindowProc(Wnd: HWND; Msg: Integer; Wparam: WParam; Lparam: LParam): LResult; stdcall;
 var
   Message: TMessage;
 begin
   Result := DefWindowProc(Wnd, Msg, WParam, LParam);
 end;
begin
 // Заполнение шаблона класса
 with WC do
 begin
   style := 0;
   lpfnWndProc := @WindowProc;
   cbClsExtra := 0;
   cbWndExtra := 0;
   hInstance := HInstance;
   hIcon := 0;
   hCursor := 0;
   hbrBackground := 0;
   lpszMenuName := nil;
   lpszClassName := PAnsiChar("InvisibleWnd");
 end;
 // Регистрация класса
 if (RegisterClass(WC) = 0) then
 begin
   ShowMessage("Class not registered...");
   Exit;
 end;
 // Создание окна
 NewWnd := CreateWindow(PAnsiChar("InvisibleWnd"),
                        PAnsiChar("PostPusk"),
                        0, 0, 0, 0, 0, WPWnd, 0, HInstance, nil);
 // Проверка создания окна
 if (NewWnd = 0) then
 begin
   ShowMessage(MSG_DLL_ERROR);
   Exit;
 end;
 // Отправка сообщения WinPost
 SendMessage(WPWnd, WM_WINPOST_MODWNDHANDLE, NewWnd, 0);
end;

В итоге окно не создается, ни с дескриптором родительского, ни с нулем...
Дополнительные вопросы:
1. Как создать окно отдельно от Первого приложения? Или в отдельном потоке?
2. Правильно ли я цепляю к создаваемому окну обработчик сообщений?
3. Второе приложение будет вызывать другую функцию из этой же библиотеки, которой необходимо знать дескриптор ПП, дескриптор невидимого окна и т.п. Где можно хранить эти данные?
Заранее спасибо за ответы...


 
Leonid Troyanovsky ©   (2006-03-24 12:49) [1]


> MaxxSoft ©   (24.03.06 11:52)
 
> Пишу библиотеку для связи двух приложений.


Это самописные приложения?
Почему обязательно сообщениями (messages) ?
Зачем, собс-но, библиотека?

Если первое приложение запускает второе,
то между ними можно организовать anonymous pipe,
что в большинстве случаев гораздо проще.

--
Regards, LVT.


 
MaxxSoft ©   (2006-03-24 12:54) [2]

Приложения не самописные. Интерфейс взаимодействия реализован на сообщениях (согласно документации).


 
MaxxSoft ©   (2006-03-24 13:03) [3]

Нашел вариант создания виртуального окна ф-ией AllocateHWND, не могу разобраться как передать ей процедуру обработки сообщений:

procedure P_PUSK_CALL(WPWnd: HWND);
var
 NewWnd: HWND;
 ModMessages: TWPModMessages;
 procedure WndProc(var Msg: TMessage);
 begin
   case Msg.Msg of
   //
   end;
 end;
begin
 // Регистрация сообщений
 ModMessages := TWPModMessages.Create;
 try
   with ModMessages do
   begin
     RegisterMessageProc(WM_WINPOST_SQLOPEN);
     RegisterMessageProc(WM_WINPOST_SQLEXEC);
     RegisterMessageProc(WM_WINPOST_SQLFREE);
     RegisterMessageProc(WM_WINPOST_MODWNDHANDLE);
     RegisterMessageProc(WM_WINPOST_SETPROP);
     RegisterMessageProc(WM_WINPOST_GETPROP);
     RegisterMessageProc(WM_WINPOST_POST);
     RegisterMessageProc(WM_WINPOST_DETACH);
   end;
 except
   ModMessages.Free;
 end;
 NewWnd := AllocateHWND(WndProc);
 if (NewWnd = 0) then
 begin
   ShowMessage(MSG_DLL_ERROR);
   Exit;
 end;
 SendMessage(WPWnd, ModMessages.FindMessage(WM_WINPOST_MODWNDHANDLE).WPMessageCode, NewWnd, 0);
end;


 
Leonid Troyanovsky ©   (2006-03-24 14:21) [4]


> MaxxSoft ©   (24.03.06 13:03) [3]
> Нашел вариант создания виртуального окна ф-ией AllocateHWND,
>  не могу разобраться как передать ей процедуру обработки
> сообщений:


Она должна быть методом.
Например,

http://www.rsdn.ru/Forum/Message.aspx?mid=883505&only=1

--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.057 c
3-1146037110
Alexey V.
2006-04-26 11:38
2006.06.25
dbf в XML


1-1147857997
Kvinta
2006-05-17 13:26
2006.06.25
Как сохранить объект в фаил?


15-1149230575
Prohodil_Mimo
2006-06-02 10:42
2006.06.25
что такое: полевая сторона?


2-1149687624
mfender
2006-06-07 17:40
2006.06.25
TWebBrowser: перехват собитий (OnMouseDown)


2-1149671044
NightCold
2006-06-07 13:04
2006.06.25
PARADOx