Re: COM и NT service

From
Vyacheslav Shubin ()
To
Michael Stepuchev
Date
2002-02-15T17:53:02Z
Area
SU.WINDOWS.NT.PROG
From: "Vyacheslav Shubin" <shubin@krista.ru>


Во первых надо прочитать про потоковые модели в COM.
Во вторых... Надо очень вдумчиво писать сервис... если кратко то:

Главный поток приложения должен иметь цикл оконных сообщеий.

Код примерно такой... взят из рабочего проекта - мусор сам выкини.

procedure RunService;
var
  hServControlThread : THandle;
  id : integer;
  msg : TMSG;

  hExternalStop : THandle;
  PSA : PSecurityAttributes;
  obj : array [0..1] of THandle;
  WaitRes : THandle;
  Done : BOOL;
begin
  CoInitialize(nil);
  PSA:= CreateSecurityAttrs;
  hExternalStop:= CreateEvent(PSA, false, false, 'DataServer');
  hServControlThread :=
CreateThread(nil,0,@ServiceControlThread,nil,0,Cardinal(id));

  obj[0]:= hServControlThread;
  obj[1]:= hExternalStop;
  Done:= false;

  repeat
    WaitRes:= MsgWaitForMultipleObjects(2,obj,false,INFINITE,QS_ALLINPUT);

    // Пришло сообщение в очередь потока.
    if WaitRes = WAIT_OBJECT_0 + 2 then begin
      // Все сообщения перенаправляем основному потоку.
      while PeekMessage(msg,0,0,0,PM_REMOVE) do
        if msg.hwnd <> 0 then DispatchMessage(msg);
      if (msg.message = WM_QUIT) then Done:= true;
    end else

    // Сброшено внешнее событие, сигнализирующее о завершении службы
    if WaitRes = WAIT_OBJECT_0 + 1 then begin
      Done:= StopService;

    // Главный поток завершился
    end else Done:= true;

  until Done;

  CloseHandle(hServControlThread);
  CloseHandle(hExternalStop);
  CoUnInitialize;
end;




"Michael Stepuchev" <mandor@perm.dataart.com> сообщил/сообщила в новостях
следующее: news:000e01c1b60b$6cb21470$db36a8c0@logrus...
> Hello, All!
>
> Никто не пробовал обращаться к COM-объектам из NT сервиса?
> Если сервис запустить в режиме отладки, как консольное приложение,
следующий
> кусок кода нормально отрабатывает.
> Если же запустить сервисом - Эксель не закрывается...
> Кто-нить знает, почему так? И что надо подкрутить?
>
> Сервис стартует из-под LocalSystem.
> Сейчас проверил - если его стартовать из-под доменного аккаунта, который
> одновременно является администратором на этой машине - та же фигня.
>
> =========Beginning of the citation==============
>       repeat
>         try
>           obj := GetActiveOleObject('Excel.Application');
>         except
>           break;
>         end;
>         obj.DisplayAlerts := FALSE;
>         for i := obj.Workbooks.Count downto 1 do begin
>           if (obj.Workbooks.Item[i].Path <> '') and not
> obj.Workbooks.Item[i].Saved then
>             obj.Workbooks.Item[i].Save;
>           obj.Workbooks.Item[i].Saved := TRUE;
>           obj.Workbooks.Item[i].Close(SaveChanges:=FALSE);
>         end;
>         obj.Quit;
>       until FALSE;
>
> =========The end of the citation================
>
> CU, Michael Stepuchev.
>   E-mail: mandor@perm.dataart.com
> == Кто юзал мой логин и весь его выюзал?! ==
>
>


--- ifmail v.2.15dev5
 * Origin: Krista NPO (2:5020/400)