OLE-Fox

Для ссылки на объект Application можно использовать системную переменную _VFP.

Visual FoxPro 5.0 имеет следующие коллекции, которые ассоциируются с объек­том Application:

· Forms — формы;

· Objects — объекты;

· Controls — элементы управления;

· Pages — страницы;

· Buttons — кнопки;

· Columns — колонки.

При этом обратите внимание, что эти коллекции являются коллекциями исключительно OLE-объектов и могут использоваться только с объектом Application. К этим коллекциям нельзя обращаться, используя ассоциированные переменные с включенными в них объектами. Вы должны использовать свойство Application, как это показано ниже:

oFrm = CREATEOBJECT( 'Form')

? oFrm.Application.Forms[1].Controls.Count

Если вы уже писали программы в Visual FoxPro 3.0, то приведенное выше утверж­дение может вызвать некоторое удивление. Перечисленные коллекций были пред­ставлены и в третьей версии, это действительно так. Но, так как Visual FoxPro 3.0 не мог выполнять функции OLE-сервера, то эти коллекции не отвечали общепринятым стандартам OLE. В первую очередь за счет того, что их свойства были доступны для изменения. Это удобно, если мы работаем с одним приложением. По-прежнему нам никто не мешает продолжать использовать эти возможности. Но, как только мы начинаем использовать приложение как OLE-сервер, т. е. обращаемся к нему из другого приложения, то должны использовать объекты Visual FoxPro как OLE-коллекции.

Например, ничто не мешает нам при создании формы в Visual FoxPro написать такой код:

Frm = CREATEOBJECT ('Form' )

? oFrm.ControlCount &&Число элементов управления в форме

Для OLE-сервера число элементов управления в форме следует определять так, как это было показано в предыдущем примере, с использованием свойства Count.

Создание OLE-сервера в VisualFoxPro

Используя Visual FoxPro 5.0, можно создать OLE-сервер, функциональность которого будет использована несколькими приложениями.

Для создания OLE-сервера используемые в нем классы должны быть описаны как OLE Public, т. е. доступные для OLE Automation. Для этого в команду DEFINE CLASS включена новая опция OLEPUBLIC. Если класс создается в Конструкторе классов, необходимо использовать соответствующий независимый переключа­ть в диалоговом окне Class Info. Отметка класса как OLE Public позволяет Project Manager при построении приложения создавать и регистрировать данный класс как ОLЕ-сервер к которому должен получить доступ OLE-контроллер.

В Visual FoxPro вы можете создать как In-Process сервер (DLL), так и Out-of-Process сервер (ЕХЕ). Оба типа сервера при работе используют библиотеку поддержки приложений Visual FoxPro (runtime), однако существенно отливаются в использовании памяти.

Сервер ЕХЕ запускается в собственном адресном пространстве, и в этом плане его запуск ничем не отличается от запуска копии Visual FoxPro.

Сервер DLL использует адресное пространство того приложения, которое инициировало его запуск. Поэтому он запускается и работает быстрее. Естественно стремление использовать в первую очередь именно такой тип сервера, однако не всегда мы можем так поступить. Сервер DLL не может использоваться как внешний сервер OLE Automation и, таким образом, должен находиться на локальном компьютере. Он не поддерживает события, т. е. не может использоваться для интерактивной работы. Следует также учитывать, что авария сервера DLL, как правило, влечет аварию управляющей программы.

Сервер ЕХЕ имеет еще одно преимущество. Он может выполнять роль OLE-сервера и обычного приложения Visual FoxPro. Таким образом, если приложение-контроллер использует сервер для выполнения процесса, который может быть весьма ресурсоемким, но выполняется локально на этом сервере, мы получим выигрыш в производительности.

Покажем простейший пример создания OLE-сервера Visual FoxPro. Создадим новый проект Ole_serv, в котором будет один программный файл со следующим кодом:

DEFINE CLASS OLE_SERV AS CUSTOM OLEPUBLIC

PROCEDURE INIT

MESSAGEBOX(PROGRAM(), "РАБОТАЕТ МОЙ ПЕРВЫЙ OLE-SERVER")

ENDDEFINE

Нажмем кнопку Build и создадим EXE- или DLL-файл. Если вы внимательно следили за сообщениями появляющимися в процессе построения файла, то наверняка заметили сообщение «Creating Type Library and Registering OLE Server», которое свидетельствует о создании и регистрации нашей программы как OLE-сервера. Напомним, что это произошло из-за наличия опции OLEPUBLIC в команде описания класса.

При построении OLE-сервера (OLE_SER.EXE или OLE_SER.DLL) создаются файлы OLE_SERV.TLB и OLE_SERV.VBR.

Файл TLB — это библиотека OLE-o6ъектов сервера, которая может быть просмотрена с помощью Visual FoxPro Class Browser, Excel, Visual Basic и Visual C. Файл VBR - это текстовый файл с данными для записи в Регистре Windows.

Теперь можно набрать в командном окне следующую строчку:

oObj = CREATEOBJECT("OLE_SERV.OLE_SERV")

После непродолжительного ожидания, требующегося для загрузки сервера вы уви­дите окно с заголовком «Работает мой первый OLE-сервер!» и сообщением с име­нем выполняемой в данный момент процедуры - Init.

Хотя наш OLE-сервер не выполняет никакой полезной работы, свидетельством его активности могут служить следующие cтрочки:

? oObj.Application.Name

? oObj.Application.Visible

? TYPE("oObj")

? oObj.Application.Docmd("MESSACEBOX(HOME())")

? oObj.Application.Docmd("_ClipText=HOME()+SYS(2003)+ SYS(2004)")

Обратите внимание на последнюю строку примера. Она записывает в буфер обме­на путь к OLE-серверу с помощью трех функций. Например, это может быть стро­ка: D\WORKS\VFP5_SAMPLE\. В нашем примере она будет повторена три раза. Это свидетельствует о том, что OLE начинает поиск сервера с каталога SYSТЕМ ОС Windows.

Таким образом, при распространении приложения и установке сервера на различных компьютерах в различных каталогах, мы можем столкнуться с проблемой указания пути как к серверу, так и используемым им компонентам (файлам базы данных, форм, отчетов и т. д.). Лучшее решение - это использование для сервера ЕХЕ-функции Windows API GetModuleFileName(), которая возвращает полный путь к главному файлу ЕХЕ текущего процесса, если в качестве первого парамет­ра передается нуль. Для сервера DLL можно использовать функцию GetModuleHandleQ с именем файла DLL в качестве параметра для возвращения указателя на сервер. Этот указатель можно использовать в функции GetModuleFileName() для получения полного пути к серверу DLL.

Сделаем еще несколько замечаний насчет построения OLE-сервера. Выберите команду Project Info из меню Project, когда открыт последний обсуждаемый проект, ив появившемся диалоговом окне перейдите на вкладку Servers. На этой вкладке сосредоточена информация, которую вы можете просмотреть или изменить для каждого класса OLE Public в проекте. Обратите внимание, что эта информация появляется только после того, как будет построен EXE- или DLL-файл.

Раскрывающийся список Instancing позволяет указать, как будет работать сервер Out-of-Process. Возможные установки приведены в табл. 3.


Страница: