![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Непонятное поведение в сервисе: есть обычный код -
AlexEgorov © (2007-09-12 16:38:00)
try
hDC := CreateICW(nil, PWideChar(PrinterName), nil, DM);
except
WriteErr('...');
end;
Так вот это код нормально работает с принтером Samsung ML-2010 из приложения, а из сервиса возникает исключение. Со всеми остальными принтерами работает нормально.
Есть другой код:
try
SizeDM := DocumentPropertiesW(0, hPrn, nil, nil, nil, DM_IN_BUFFER or DM_COPY);
except
WriteErr('...');
end;
Так вот при вызове этого кода из сервиса для этого принтера возникает вообще странная ситуация - до эксепшена даже не доходит, а просто сервис падает! т.е. останавливается :( из приложения всё работает отлично. Как это можно победить?
Сергей М. (2007-09-12 17:16:00) [1]
> Я ничего не ожидал поймать
А зачем тогда блок try..except ?
Сергей М. (2007-09-12 17:15:00) [2]
> вызывается LoadServer - там запускаются потоки
Вот и показывай, как и что там происходит, при запуске потоков и в самих потоках ...
AlexEgorov (2007-09-12 17:14:00) [3]Я ничего не ожидал поймать, но после этого вызова для этого принтера сервис останавливается
Сергей М. (2007-09-12 17:12:00) [4]
> DocumentPropertiesW
> до эксепшена даже не доходит
А какой "эксепшн" ты ожидал поймать ?
AlexEgorov (2007-09-12 17:11:00) [5]Ну с терминологией ошибся - в сервисе у меня вызывается LoadServer - там запускаются потоки, вот в них и происходит работа:
procedure ServiceMain(argc: Cardinal; var argv: array of PChar); stdcall;
begin
try
hSvc := RegisterServiceCtrlHandler(ServiceName, @ServiceCtrlHandler);
if (hSvc <> 0) then
try
SetSvcStatus(SERVICE_START_PENDING, 0, 1, 10000);
LoadServer;
SetSvcStatus(SERVICE_RUNNING, 0, 0, 0);
hStopEvent := CreateEvent(nil, True, False, nil);
WaitForSingleObject(hStopEvent, INFINITE);
CloseHandle(hStopEvent);
SetSvcStatus(SERVICE_STOP_PENDING, 0, 1, 10000);
DeletePrinterThreads;
SetSvcStatus(SERVICE_STOP_PENDING, 0, 2, 10000);
FreeStorages;
finally
SetSvcStatus(SERVICE_STOPPED, 0, 0, 0);
end
else
WriteErr(70, '');
except
WriteErr(0, 'ServiceMain');
end;
end;
Сергей М. (2007-09-12 17:06:00) [6]
> В сервиси в основном потоке
Каждый конкретный сервис работает в дополнительномпотоке.
AlexEgorov (2007-09-12 16:56:00) [7]В сервиси в основном потоке, код работал годами, пока не попался этот принтер
Eraser (2007-09-12 16:47:00) [8]
> AlexEgorov (12.09.07 16:38)
> до эксепшена даже не доходит, а просто сервис падает!
в каком именно месте?