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)