Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

**Почему в Delphi XE3 изменяется порядок обработки запросов COM-сервера и как это исправить**

Delphi , Технологии , COM и DCOM

Почему в Delphi XE3 изменяется порядок обработки запросов COM-сервера и как это исправить

В данной статье мы рассмотрим проблему, с которой столкнулись разработчики, использующие Delphi XE3 для создания COM-серверов. Проблема заключается в том, что в предыдущих версиях Delphi (7 и 2006) запросы к COM-серверу обрабатывались одновременно, в то время как в Delphi XE3 запросы обрабатываются по одному, ожидая завершения предыдущего.

Причины изменения поведения

Изменение порядка обработки запросов может быть связано с изменением модели многопоточности, которая применяется в Delphi XE3. В более ранних версиях использовалась модель многопоточности Multi/Free-threaded, которая позволяет COM-системе обрабатывать запросы параллельно. В Delphi XE3, возможно, используется модель Apartment-threaded, при которой COM-система последовательно обрабатывает запросы.

Проверка модели многопоточности

Для начала стоит проверить модель многопоточности, которая установлена для COM-объекта в каждой из версий Delphi. Модель многопоточности COM-сервера регистрируется в реестре, и её можно проверить, не в коде, а непосредственно в реестре.

Исправление проблемы

Один из пользователей, столкнувшийся с подобной проблемой, обнаружил, что добавление вызова CoUninitialize перед вызовом Application.Initialize позволяет серверу Delphi XE3 обрабатывать запросы параллельно. Это связано с тем, что вызов CoInitializeEx с параметром COINIT_MULTITHREADED в Delphi XE3 возвращает код ошибки RPC_E_CHANGED_MODE, что указывает на изменение режима многопоточности. Вызов CoUninitialize перед этим позволяет избежать этого конфликта.

Пример кода

Ниже приведён пример кода, который демонстрирует создание COM-объекта в Delphi на Object Pascal:

unit Unit2;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
  Windows, ActiveX, Classes, ComObj, Project1_TLB, StdVcl;
type
  TTest = class(TTypedComObject, ITest)
  protected
    function Method1(N: Integer): HResult; stdcall;
  end;
implementation
uses ComServ;
function TTest.Method1(N: Integer): HResult;
var I: Integer;
begin
  for I := 1 to N do
    Sleep(1000);
end;
initialization
  TTypedComObjectFactory.Create(ComServer, TTest, Class_Test,
    ciMultiInstance, tmFree);
end.

Заключение

В случае обнаружения проблемы с изменением порядка обработки запросов в Delphi XE3, рекомендуется проверить модель многопоточности COM-сервера в реестре. Если проблема подтверждена, можно попробовать добавить вызов CoUninitialize перед инициализацией COM-сервера, чтобы восстановить параллельную обработку запросов. Также стоит обратить внимание на различия между старым (до XE3) и новым (DAX) фреймворками COM в Delphi.

Создано по материалам из источника по ссылке.

Контекст: Статья обсуждает проблему изменения порядка обработки запросов к COM-серверу в Delphi XE3 и предлагает способ её устранения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: COM и DCOM ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 01:23:07/0.0032968521118164/0