Пользователи, работающие с COM-серверами в службах без использования библиотеки SvCom в Delphi XE2 и выше, могут столкнуться с проблемами при попытке создать такую конфигурацию в Delphi Tokyo 10.2.3. Одной из таких проблем является невозможность подключения клиентского приложения к серверу, что приводит к ошибке "Server Execution Failed". В данной статье мы рассмотрим, как правильно настроить реестр для работы COM-сервера в службе без использования SvCom.
Проблема
При попытке создать COM-сервер, работающий в контексте службы, без использования SvCom, разработчики могут столкнуться с трудностями при регистрации сервера в системе. Это может быть связано с неправильной настройкой ключей реестра или их отсутствием. В частности, для корректной работы сервиса, использующего COM-сервер, необходимо правильно настроить ключи в реестре Windows.
Регистрация COM-сервера в службе
Для регистрации COM-сервера в службе необходимо выполнить следующие шаги:
Инициализация COM-библиотеки: Перед использованием COM-объектов необходимо инициализировать COM-библиотеку. Это делается с помощью функции CoInitialize(nil).
Создание экземпляра COM-сервера: После инициализации COM-библиотеки, необходимо создать экземпляр COM-сервера. Это можно сделать в методе ServiceStart сервиса.
Настройка реестра: В методе ServiceAfterInstall сервиса необходимо добавить записи в реестр, которые позволяют серверу быть доступным для клиентов. В частности, необходимо установить ключи HKCR и HKLM, которые указывают системе, что сервер может выполняться в качестве службы.
pascal
procedure TTestServiceObj.ServiceAfterInstall(Sender: TService);
begin
// Инициализация записи для регистрации в качестве сервиса
RegisterAsService(GUIDToString(CLASS_BWSvcTest), Self.Name);
// Другие операции по настройке реестра
end;
Важно отметить, что для удаления сервера из службы в методе ServiceBeforeUninstall необходимо также удалить соответствующие записи из реестра.
pascal
procedure TTestServiceObj.ServiceBeforeUninstall(Sender: TService);
begin
// Удаление записей, установленных RegisterAsService
// Здесь должны быть соответствующие вызовы DeleteKey для ключей, установленных ранее
end;
Объектный код создания COM-сервера: Разработчикам следует убедиться, что код создания объекта COM-сервера запускается в правильном контексте потока. Например, создание объекта COM-сервера следует выполнять в методе ServiceExecute, а не ServiceStart, так как они выполняются в разных потоках.
Создание и освобождение интерфейсов COM: После создания сервиса, не забудьте освободить все связанные интерфейсы и завершить работу сервиса, при помощи CoUninitialize.
Подтвержденный ответ
В качестве решения проблемы, вы можете использовать автоматизированные функции из предоставленных модулей, таких как TAutoObjectFactory.RegisterAsService, которая создает необходимые ключи в реестре для сервера COM, который будет обращаться к службе. Однако, так как в библиотеке нет аналога для удаления, вам потребуется вручную удалять эти ключи в процессе удаления сервера, как это описано в альтернативных комментариях.
Альтернативный ответ
В качестве альтернативного подхода, вы можете обратить внимание на функцию RegisterAsService, которая автоматически создает необходимые ключи для работы сервера в качестве службы после установки, но помните, что для удаления этих записей вам придется написать их самостоятельно.
Заключение
Установка и настройка COM-сервера в службе без использования библиотеки SvCom может быть непростой задачей, требуя аккуратности и понимания внутренних механизмов работы COM и реестра. Следуя приведенным рекомендациям, можно успешно интегрировать COM-сервер в службу для использования его возможностей клиентскими приложениями.
Разработчики в Delphi Tokyo сталкиваются с необходимостью настроить реестр для работы COM-сервера в службе без использования библиотеки SvCom, чтобы обеспечить корректное подключение клиентских приложений к серверу.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS