Советы по Delphi

       

DCOM


О технологии DCOM. Я написал 3-звенное распределенное RDBMS-приложение, используя новые модули удаленных данных (Remote Data Modules) из поставки Delphi3. Я добавил некоторые собственные интерфейсы и методы в мой удаленный модуль данных для поддержки пользовательских SQL-запросов от клиента. (Была такая необходимость.) Все заработало просто замечательно, но самая отрадная весть - вся клиентская часть приложения представляла собой всего-лишь 2 файла! Без BDE! Без RDBMS-клиента! Без конфигурации! Классно, правда? Всего два файла - my.exe и 'dbclient.dll'.

Мой проект всего-лишь демонстрирует данную технологию и на момент написания совета он все же медленнее, чем 2-звенный метод, но я потратил на кодирование всего лишь 2 дня, а оптимизация кода потребует еще некоторе время. Я также подозреваю, что медленная работа моего ORB связана с функционированием его на той же сильно загруженной машине, на какой я и разрабатываю свои программы.

Кто-нибудь еще разрабатывал DCOM-объекты? Я хотел бы здесь начать цикл статей (советов) о применении Delphi для создания распределенных приложений. В течение ближайших месяцев я должен разработать несколько распределенных приложений уровня предприятия. Для пользы дела я берусь опубликовать все ваши наработки, подсказки, хитрости и ньюансы технологии, присланные по электронной почте.

Приведу пример:

Экспорт DB-компонентов из модулей удаленных данных

После того, как Вы создали приложение с использованием пункта меню New->Remote Data Module при создании модуля данных сервера приложений, Вам необходимо экспортировать все необходимые для него TDataSet и TProviders-компоненты. Для этого щелкните на них правой кнопкой мыши и выберите пункт экспорта их Вашего модуля данных.

Добавление Ваших собственных методов в модули удаленных данных

Есть два пути решения задачи. При нажатии правой кнопки мыши в окне исходного кода, возникающего при просмотре исходников модулей удаленных данных, вызывается контекстное меню, содержащее пункт "Add to Interface". Это мини-Мастер, позволяющий создать процедуру, функцию или декларацию какого-либо свойства. Он последовательно предложит заполнить необходимые поля на нескольких экранах (каждый экран содержит поясняющую информацию). Не забывайте о том, что Вы просто не сможете ввести какие-либо данные для Ваших параметров. OLE/COM/DCOM/ActiveX/Whatever в Delphi поддерживают только некоторое подмножество типов данных. (например, тип WideString вместо типа String) Полный список поддерживаемых типов доступен в разделе 'types:type libraries' электронной справки.

После прохождения всех этапов Мастера, Delphi переместит курсор в правую часть страницы для генерации кода нового метода.

Второй способ заключается в использовании редактора библиотеки типов (меню View->Type Library). Это лучшее решение в случае, если Вам необходимо добавить большое количество новых методов. Сначала Вы можете разместить их здесь и включить в свой код позже. При записи кода на диск, в отличие от создаваемых в Delphi заголовков обработчиков событий, редактор библиотеки типов не удалит их даже в случае, если тело метода остается пустым.

Доступ к методам из модуля удаленных данных (или другого COM-объекта)


Единственное мною обнаруженное решение состоит в использовании компонента TRemoteServer (закладка Data Access). Установите в свойствах компонента имя компьютера и имя сервера. После этого можно обратиться к любому существующему методу, например:

MyDataModule.MyRemoteServer.AppServer.MyCustomMethod( myParam,myParam2 );
Код использует свойство AppServer компонента TRemoteServer. Данное свойства имеет тип Variant, и в данном случае имеет отношение к модулю удаленных данных. Во время компиляции Delphi не обращает внимание на имя вызываемого метода, так как выяснить его наличие можно только во время его вызова. Проверьте это во время прогона программы.

Проблема с добавлением Ваших собственных методов с интерфейсами в библиотеку типов.

При добавлении методов в модуль удаленных данных через новые интерфейсы, я столкнулся со странной проблемой. После создания новых интерфейсов, кодирования, сохранения, закрытия и повторного открытия проекта, Delphi иногда добавляет ключевое слово 'const' к спискам параметров новых интерфейсов. При этом Delphi -не делает- обновления списка параметров в коде модуля удаленных данных, поэтому при компиляции вновь открытого проекта компилятор ругается на противоречивые декларации метода. Затем мне приходится вручную добавлять ключевое слово 'const' к декларациям данных и определений методов модуля. После все работает как часы. Так что не забывайте про ключевое слово 'const'. По крайней мере это выработало во мне определенный рефлекс, и я "на автопилоте" добавляю его во все списки параметров моего метода.

Это может служить проблемой для методов, модифицирующих какие-либо параметры. Может DCOM это не поддерживает? Какие идеи?

[000073]


Содержание раздела