15 мая 2013 г.

Использование HTMLHelpViewer в DLL

В модуле HTMLHelpViewer со времени его появления в Delphi 2005 и до выхода Update 4 для Delphi XE2 была ошибка, не позволяющая использовать этот модуль в DLL. Ошибка состоит в том, что в секции finalization всегда выполняется вызов HtmlHelp(HH_CLOSE_ALL), что может приводить к загрузке библиотеки HHCTRL.OCX. Для обычного приложения это не страшно, просто теряется немного времени на загрузку-выгрузку библиотеки. Но если мы пишем DLL (например, COM-объект или плагин для другого приложения), то выполнение секции finalization будет происходить внутри DllMain, и попытка загрузить HHCTRL.OCX приведет либо к зависанию приложения, либо к ошибке Access Violation (в зависимости от версии Windows).

26 апреля 2013 г.

WM_PAINT во время ожидания вызова COM-сервера

В новых версиях Windows, начиная с Vista, приложение получает сообщение WM_PAINT во время ожидания вызова COM-сервера. Как написано в статье «Do you receive WM_PAINT when waiting for a COM call to return?», основной причиной для этого стала необходимость в правильной работе UAC (контроль учётных записей пользователей). Если приложение не рассчитано на такое поведение, то это может привести к ошибкам.

1 марта 2013 г.

Запись в качестве ключа TDictionary

В данной статье мы рассмотрим один тонкий момент при использования записи в качестве ключа для TDictionary.

Следуя общепринятым практикам разработки ПО, попробуем реализовать шаблон проектирования Коллекция объектов (Identity Map), с помощью TDictionary. В качестве ключа будем использовать идентификатор сущности, а в качестве значения объект сущности. Идентификаторы сущностей могут быть как простые, так и составные. Для составных будем использовать запись — идентификатор должен быть объектом-значением (Value Object). В примере мы создадим коллекцию объектов «Пользователь» для ЛОЦМАН:PLM.

23 февраля 2013 г.

Всплывающие подсказки и QC85705

В VCL есть незакрытый баг QC85705. Он был открыт в июне 2010 года для Delphi 2010, но присутствует и в старых, и в новых версиях.

В ходе разработки одного из плагинов для ЛОЦМАН:PLM я столкнулся с ошибкой «Access violation at address...» при выгрузке плагина. Ошибка возникала не каждый раз, а только иногда, и приводила к краху всего приложения.

1 сентября 2012 г.

Подключение к серверу приложений

В данной статье мы рассмотрим самостоятельное подключение к серверу приложений. Из предыдущей статьи мы знаем, как прочитать параметры подключения из реестра. Теперь мы подключимся к серверу приложений, выберем базу данных и рабочий проект, и сможем читать и изменять объекты базы данных.

5 июля 2012 г.

Подключение к серверу приложений. Наборы данных

Перед тем, как перейти к вызову методов сервера приложений, нужно разобраться с форматом, в котором сервер приложений возвращает наборы данных.
Сервер может возвращать наборы данных в двух форматах: внутреннее двоичное представление TClientDataSet или XML. По умолчанию используется первый формат, для использования XML необходимо вызвать метод SetFormat сервера приложений с параметром 'xml'.

7 июня 2012 г.

Подключение к серверу приложений. Параметры подключения

В каких случаях нам понадобится самостоятельно подключаться к серверу приложений?

Во-первых, если вы пишете свое приложение для работы с Лоцман.

Во-вторых, если вы пишете плагин и необходимо работать с WorkFlow из клиентов версии меньше 11, или когда необходимо выполнить какие-либо действия от имени пользователя, отличного от того, который запустил клиент.

Для подключения к серверу приложений необходимы следующие данные:
  1. Тип соединения: DCOM, сокет-соединение или веб-соединение. Работа с сервером приложений будет осуществляться с помощью классов TDCOMConnection, TSocketConnetion или TWebConnection соответственно.
  2. Имя сервера, порт для сокет-соединения, имя, пароль пользователя и имя прокси-сервера для веб-соединения.
  3. Имя базы данных.
  4. Способ аутентификации в базе данных: аутентификация средствами Windows или аутентификация средствами SQL-сервера.
  5. Имя и пароль пользователя для аутентификации средствами SQL-сервера.
В данной статье мы рассмотрим, где и как хранит параметры подключения клиентский модуль Лоцман. В представленной реализации подключения к серверу приложений будут использоваться те же самые параметры подключения.