Форум: "WinAPI";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.06.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c