Сервисные приложения и ком плагины - PullRequest
0 голосов
/ 04 марта 2011

Я написал набор плагинов, которые нормально работают в обычном приложении.Но когда я пытаюсь использовать их в приложении службы, моя служба останавливается, когда она достигает функции CreateComObject.Могу ли я использовать COM плагины в сервисном приложении?Это код:

procedure TWCMService.CreateControllerList;
var
  List: TAutoFreeList<TController>>;
  i: integer;
  Plugin: IPluginInterfaces;
begin
  try
    List := TAutoFreeList<TController>.Create;
    DatabaseModule.IBDatabase1.Connected := true;
    DatabaseModule.SelectControllers(List);
    DatabaseModule.IBDatabase1.Connected := false;
    Plugin := CreateComObject(StringToGuid('{F2959AEC-644F-49E4-9012-B9B3BF34B43F}')) as  IPluginInterfaces;
    for i := 0 to List.Count - 1 do
      begin
        Plugin.Init(StringToGuid(List[i].PluginId));
        FAvailControllers.Add(CreateComObject(Plugin.GetCommunicationPluginGuid) as ICommunicationPlugin);
        FAvailControllers[i].Init(Self as IServiceApplication);
        FAvailControllers[i].SetMAC(List[i].ControllerMAC);
        MessageBox(0, 'Dodany', 'Uwaga', MB_OK);
      end;
    List.Free;
    FAvailControllersCurrentIndex := 0;
    Timer1.Enabled := true;
  except
    raise Exception.Create('WCM Serwis: Error Message');
  end;
end;

Ответы [ 5 ]

3 голосов
/ 04 марта 2011

Непроверенный и просто не в моей голове ... Вы, вероятно, обнаружите, что вам нужно инициализировать COM (вызывать coinitialize), это обычно делается для вас с приложением Windows (в приложении. Запуск или выше по цепочке) с сервисным апплетом, вы бы этого не сделали, вам нужно будет сделать это самостоятельно.

0 голосов
/ 12 мая 2013

Может ли ваша проблема быть похожей на ту, с которой я столкнулся?
EIntfCastError 'Интерфейс не поддерживается' при запуске в качестве TServiceApplication
При создании объекта, т.е. TComObjectFactory.Create Я изменил потокмодель от tmSingle до tmApartment.Затем я разрегистрировал и перерегистрировал сервер.Presto!Не совсем уверен, почему, но у меня это работает.

0 голосов
/ 04 марта 2011

Это может быть что-то связанное с безопасностью.Зависит от вашей операционной системы.Службы могут работать под другой учетной записью.Права этой учетной записи могут быть недостаточными для создания нужного COM-объекта.Просто угадай.

0 голосов
/ 04 марта 2011

Как уже было сказано, вам нужно убедиться, что COM инициализирован. Но это не может быть главной причиной.
Вы используете Interbase и для подключения к базе данных, возможно, он связывается по сети с сервером базы данных. (Даже если БД находится в той же системе!) Но служба Windows по умолчанию не имеет доступа к сети, поэтому необходимо добавить зависимость от службы в функциональность сети.
Ваша проблема может быть такой же, как в этом вопросе , что делает его дубликатом!

0 голосов
/ 04 марта 2011

Возможно, вам потребуется инициализировать библиотеку COM для каждого потока, вызывающего CoInitialize. Описано здесь.http://chrisbensen.blogspot.com/2007/06/delphi-tips-and-tricks_20.html

...