Как вызвать из внешней проги в ВИП интерфейсе событие?
Добавлено: 11 май 2005, 12:01
Diman
Может быть кто-то делал что-нибудь подобное. Стоит следующая задача:
Нужно из внешней проги написанной на Builder C++ (или Delphi) при помощи каких-либо операторов вызвать в Галактическом интерфейсе определенное событие.
У меня получается посылать события для основного Галактического окна функцией SendMessage и иже с ними, но ВИПовский интерфейс в Windows в качестве окна или процесса не виден, по сему послать ему какое-нибудь событие при помощи таких функций невозможно.
ВИП интерфейс запускаю из формы, при помощи RunInteface, пробовал в Supporte запускать этот же интерфейс модально и немодально эффект то же. Пробовал Broadcast сообщения, то бишь всем посылать, пробовал посылать сообщения основному окну, эффект один: до нужного интерфейса событие не доходит.
Заранее благодарен за любую помощь или совет.
Добавлено: 11 май 2005, 18:11
Maverick
Событие в галактическом окне - вещь внутренняя и доступна только галактике.
Хотя....
В ASDK описана такая вещь - может тебе это нужно?
OLE-шлюз для вызова интерфейсов Галактики.
1. Общее описание
Описывается возможность Атлантиса, позволяющая вызывать VIP-интерфейсы и их функции из внешних программ. Вызов осуществляется средствами Automation, и может быть написан на Delphi, VB/VBA и т.п.
Основные возможности:
- Программный запуск и останов Атлантис-приложения (.exe); каждый EXE идентифицируется из Automation-клиента отдельно,
- синхронное выполнение VIP-интерфейсов с отображением на экране и получением строкового результата,
- загрузка VIP-интерфейсов без отображения на экране и вызов их внутренних процедур и функций, с получением значений функций.
2. Оформление Галактики как Automation-сервера.
В качестве Automation-сервера может использоваться любой .EXE, собранный с Атлантис-приложением. Несколько EXE одновременно могут использоваться как Automation-сервера. Особых требований к сборке EXE не предъявляется.
Требования к клиентскому компьютеру: Windows-95 или NT 4., Windows/GUI-версия Галактики.
После сборки или установки Галактики на компьютере необходимо выполнить следующие действия (для каждого EXE, который будет использоваться как Automation-сервер):
- определить параметры исполнения EXE как Automation-сервера: с каким драйвером БД он будет работать, с какой БД, и т.п.; выбранные параметры необходимо оформить в виде .cfg-файла по умолчание для данного .exe;
- обеспечить наличие в директории с .exe файла AtOleAut.dll из директории Atlantis\EXE\,
- зарегистрировать Automation-сервер; для этого запустить .exe с параметром /RegServer; информация о сервере будет занесена в системный реестр (Registry) по правилам COM/Automation.
Для того, чтобы прекратить использование данного .exe в качестве Automation-сервера, необходимо выполнить удаление информации о регистрации. Для этого следует запустить .exe с параметром /UnRegServer.
3. Методика создания VIP-интерфейсов для использования из Automation-клиентов.
Возможно создание VIP-интерфейсов одного из двух типов.
Тип 1: Интерфейс, вычисляющий значения, или выполняющий действия.
Такой интерфейс предназначается для синхронного вызова (т.е., клиент ждет завершения работы интерфейса). Он может быть визуальным, или не визуальным (обработчик cmInit интерфейса завершается командой Abort). Интерфейс может принимать произвольные параметры (только от клиента, но не возвращать через них значения) и формировать строковый результат (через глобальную переменную COM_Interface_StrResult).Выполнение такого интерфейса аналогично выполнению по команде RunInterface.
Тип 2: Интерфейс-библиотека функций.
Такой интерфейс предназначается для загрузки и предоставления своих функций клиенту. Этот тип интерфейса не отображается на экране. Интерфейс может принимать произвольные параметры. При загрузке интерфейса вызывается его обработчик cmInit, который может заканчиваться или не заканчиваться командой Abort.
Параметры, переданные интерфейсу, могут быть использованы как в его обработчике cmInit, так и в его процедурах и функциях, как глобальные переменные.
Все процедуры и функции интерфейса могут быть вызваны клиентом. При этом обеспечивается передача параметров процедур и функций по значению (от клиента к процедуре или функции). Результат функции возвращается клиенту.
Как для самого интерфейса, так и для процедур и функций интерфейса, во время вызова клиентом контролируется количество параметров и совместимость типов значений. В случае несовпадения генерируется стандартная для Automation реакция.
4. Объекты и методы.
4.1 Объект приложения
Для каждого EXE, выступающего как Automation-сервер, создается класс, имеющий имя (ProgId) вида <имя EXE>.APP. Например, для Galnet.exe это будет 'GALNET.APP'.
ЗАМЕЧАНИЕ. ClsId (GUID) объекта .APP не приводится, поскольку он генерится динамически при выполнении регистрации сервера (/RegServer).
ProgId может быть использован, например, в вызове CreateObject на VBA:
ПРИМЕР 1: (VBA)
Dim GalApp As Variant
Set GalApp = CreateObject("GalNet.App")
Создание объекта приложения вызывает, при необходимости, запуск соответствующего EXE.
Объект приложения имеет 4 метода.
Метод ExecVip позволяет выполнить VIP-интерфейс из любого ресурса, открытого Атлантис-приложением.
Параметры ExecVip:
1-й параметр - имя Vip-интерфейса
остальные - параметры VIP-интерфейса (если он имеет параметры).
Параметры, передаваемые VIP-интерфейсу, должны совпадать по количеству и быть совместимыми по типу с параметрами, описанными в VIP-интерфейсе (секция Parameters).
Метод ExecVip является функцией, возвращающей значение строковой глобальной переменной COM_Interface_StrResult (если ее значение сформировано интерфейсом).
Метод (свойство) LastExecCode возвращает целое число, представляющее собой код завершения последнего вызова ExecVip, и может принимать значения 11 (cmCancel) или 14 (cmOK) - аналогично результату RunInterface.
Как правило, для интерфейсов выбора завершение с кодом cmOK означает, что пользователь завершил интерфейс выбором значения (Enter или кнопка OK), а завершение с кодом cmCancel - что пользователь отказался от выбора (Esc, Alt_F4, закрытие окна мышью).
ПРИМЕР 2: (VBA)
Dim GalApp As Variant, Str As Variant
Set GalApp = CreateObject("GalNet.App")
Str = GalApp.ExecVip("SelectPodr", "Бухгалтерия")
if (GalApp.LastExecCode = 14) then
MsgBox "Выбрано подразделение:" + Str
end if
Метод LoadVip позволяет загрузить указанный VIP-интерфейс, чтобы затем вызывать его процедуры и функции.
Параметры LoadVip:
1-й параметр - имя Vip-интерфейса
остальные - параметры VIP-интерфейса (если он имеет параметры).
Параметры, передаваемые VIP-интерфейсу, должны совпадать по количеству и быть совместимыми по типу с параметрами, описанными в VIP-интерфейсе (секция Parameters).
Метод LoadVip является функцией, возвращающей ссылку на объект, представляющий загруженный VIP-интерфейс. Использование метода LoadVip и возвращаемого им объекта обсуждается в следующем пункте.
Метод Quit позволяет остановить EXE приложения. При этом не контролируется, обслуживает ли данное приложение других клиентов, или имеет ли неосвобожденные объекты.
4.2 Объект загруженного интерфейса.
Ссылка на объект загруженного интерфейса (VIPINTERFACE) возвращается при удачном завершении методом LoadVip.
ЗАМЕЧАНИЕ. Объект VIPINTERFACE не имеет своего ClsId (GUID), и поэтому может быть создан только посредством объекта приложения.
ПРИМЕР 3: (VBA)
Dim GalApp As Variant, Iface As Variant
Set GalApp = CreateObject("GalNet.App")
IFace = GalApp.LoadVip("API_Functions", "Prepare", "export", "export.dbf")
if (IFace Is Nothing) then
MsgBox "Функции API не реализованы"
Exit Sub
end if
Методами объекта VIPINTERFACE являются процедуры и функции VIP-интерфейса.
Вызов методов из клиента аналогичен вызову методов других объектов. Выгрузка загруженного интерфейса выполняется при очистке переменной, содержащей ссылку на него.
ПРИМЕР 4:
IFace.Prepare
IFace.OpenFile "export.dbf", 1000
Count = IFace.CountRecords("Ware", 1, 15000000)
IFace.CloseFile
Set IFace = Nothing