Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.09.2009, 14:51   #1
Basketman
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 16
Печаль Проблема со службой (Delphi 7)

Простой пример: создаю file -> new -> other -> Service Application
Дальше кидаю на "форму" таймер, пишу в нем че-нибудь, устанавливаю службу, но таймер не работает, хотя служба нормально установилась. Скажите пожалуйста, почему? И как разрешить эту проблему?
Basketman вне форума Ответить с цитированием
Старый 29.09.2009, 09:58   #2
SuperVisor
Павел Сергеевич
Форумчанин
 
Регистрация: 05.11.2006
Сообщений: 665
По умолчанию

Служба установилась - уже хорошо, а она запустилась? Во время старта службы таймер запускается?
Познавая других, мы познаем себя.
С'est la vie...
SuperVisor вне форума Ответить с цитированием
Старый 29.09.2009, 17:48   #3
Basketman
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 16
По умолчанию

таймер работает только до того, как я нажму кнопку ОК на сообщении об успешной службы, как только я жму ОК, таймер тут же вырубается, и дальше ни каких признаков жизни(( Скажите, в чем дело?
Basketman вне форума Ответить с цитированием
Старый 29.09.2009, 20:27   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

- делай лучше на winapi службу
Цитата:
...
program ini_run5;

uses
Windows, WinSvc,sysutils;

const
SERVICE_NAME = 'Automatic run program';
SERVICE_DISPLAY_NAME = 'Service RAMEDIA - BadloSergey';
SERVICE_DISPLAY_TOTAL = 'http://raxp.radioliga.com';

var
hSCM: SC_HANDLE;
hService: SC_HANDLE;
hServStatus: SERVICE_STATUS_HANDLE;
status: SERVICE_STATUS;
ErrorLogFileName, ServicesListFileName: string;
hThread: HWND;
ThID: Cardinal;

function IsInstalled: boolean; stdcall;
begin
result:= false;
try
hSCM:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if hSCM <> 0 then begin
hService:= OpenService(hSCM, SERVICE_NAME, SERVICE_QUERY_CONFIG);
if hService <> 0 then begin
CloseServiceHandle(hService);
result:= true;
end else
ErrorLog('IsInstalled OpenService : '+GetErrosString);
CloseServiceHandle(hSCM);
end else ErrorLog('IsInstalled OpenSCManager : '+GetErrosString);
except end
end;

function Install: boolean; stdcall;
begin
result:= true;
if IsInstalled then exit;

hSCM:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if hSCM = 0 then begin
ErrorLog('Install OpenSCManager : '+GetErrosString);
result:= false;
exit;
end;

hService:= CreateService(
hSCM, SERVICE_NAME, SERVICE_DISPLAY_NAME, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START,
SERVICE_ERROR_NORMAL, PChar(ParamStr(0)), SERVICE_DISPLAY_TOTAL, nil, nil, nil, nil);

if (hService = 0) then begin
ErrorLog('Install CreateService : '+GetErrosString);
CloseServiceHandle(hSCM);
result:= false;
exit;
end;


CloseServiceHandle(hService);
CloseServiceHandle(hSCM)
end;

function UnInstall: boolean; stdcall;
var status: SERVICE_STATUS;
begin
if not IsInstalled then begin
result:= true;
exit
end;

result:= false;
try

hSCM:= OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if hSCM = 0 then begin
ErrorLog('UnInstall OpenSCManager : '+GetErrosString);
exit
end;

hService:= OpenService(hSCM, SERVICE_NAME, SERVICE_ALL_ACCESS);
if hService = 0 then begin
ErrorLog('UnInstall OpenService : '+GetErrosString);
CloseServiceHandle(hSCM);
exit
end;

ControlService(hService, SERVICE_CONTROL_STOP, status);
if DeleteService(hService) then result:= true
else ErrorLog('UnInstall DeleteService : '+GetErrosString);
//
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);

except end
end;

function GetData: boolean; stdcall;
type
TArrayEnumServicesStatus = array of TEnumServiceStatus;
const
StatusText : array [SERVICE_STOPPED..SERVICE_PAUSED] of string =
('Stopped', 'Starting', 'Stopping', 'Started', 'Restarting', 'Pausing', 'Paused');
var
EnumServiceStatus: Pointer;
BytesAllocated, BytesNeeded, ServicesReturned, ResumeHandle : DWORD;
i: Integer;
bBol: boolean;

fLog: THandle;
BitesWriten: DWORD;
Msg: string;
begin
result:= false;
ResumeHandle:= 0;

hSCM:= OpenSCManager(nil, nil, GENERIC_READ or GENERIC_EXECUTE);
if hSCM = 0 then begin
ErrorLog('GetDate OpenSCManager : '+GetErrosString);
exit;
end;

BytesAllocated:= 1024; //маловато будет нужен повтор
GetMem(EnumServiceStatus, BytesAllocated);
try
bBol:= EnumServicesStatus(hSCM, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, TEnumServiceStatus(EnumServiceStatu s^),
BytesAllocated, BytesNeeded, ServicesReturned, ResumeHandle);
if GetLastError = ERROR_MORE_DATA then begin
BytesAllocated:= BytesNeeded;
ReallocMem(EnumServiceStatus, BytesNeeded);
bBol:= EnumServicesStatus(hSCM, SERVICE_TYPE_ALL, SERVICE_STATE_ALL, TEnumServiceStatus(EnumServiceStatu s^),
BytesAllocated, BytesNeeded, ServicesReturned, ResumeHandle);
end;

if bBol then begin
fLog:= CreateFile(PChar(ServicesListFileNa me), GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);

for i:= 0 to ServicesReturned - 1 do
with TArrayEnumServicesStatus((@EnumServ iceStatus)^)[i] do begin
Msg:= lpServiceName + ' - ' + lpDisplayName +', '+ Statustext[ServiceStatus.dwCurrentState] + #13#10;
WriteFile(fLog, Msg[1], Length(Msg), BitesWriten, nil);
end;

CloseHandle(fLog);
result:= true;
end else
ErrorLog('GetDate EnumServicesStatus : '+GetErrosString);
CloseServiceHandle(hSCM);
finally
FreeMem (EnumServiceStatus, BytesAllocated);
end;
end;
...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 29.09.2009 в 20:31.
raxp вне форума Ответить с цитированием
Старый 29.09.2009, 20:29   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

и немножно еще...

Цитата:
procedure ServiceCtrlHandler(Opcode: Cardinal); stdcall;
begin
case Opcode of
SERVICE_CONTROL_STOP: begin
if not ReportStatusToSCMgr(SERVICE_STOP_PE NDING, NO_ERROR, 0) then
ErrorLog('ServiceCtrlHandler SERVICE_STOP_PENDING : '+GetErrosString);
while (Status.dwCurrentState = SERVICE_STOP_PENDING) do sleep(100);
end;
SERVICE_CONTROL_PAUSE: begin
if not ReportStatusToSCMgr(SERVICE_PAUSE_P ENDING, NO_ERROR, 0) then
ErrorLog('ServiceCtrlHandler SERVICE_PAUSE_PENDING : '+GetErrosString);
SuspendThread(hThread);
if not ReportStatusToSCMgr(SERVICE_PAUSED, NO_ERROR, 0) then
ErrorLog('ServiceCtrlHandler SERVICE_PAUSED : '+GetErrosString);
end;

SERVICE_CONTROL_CONTINUE: begin
if not ReportStatusToSCMgr(SERVICE_START_P ENDING, NO_ERROR, 0) then
ErrorLog('ServiceCtrlHandler SERVICE_START_PENDING : '+GetErrosString);
ResumeThread(hThread);
if not ReportStatusToSCMgr(SERVICE_RUNNING , NO_ERROR, 0) then
ErrorLog('ServiceCtrlHandler SERVICE_RUNNING : '+GetErrosString);
end;

SERVICE_CONTROL_INTERROGATE: begin
if not SetServiceStatus(hServStatus, status) then
ErrorLog('ServiceCtrlHandler SERVICE_CONTROL_INTERROGATE : '+GetErrosString);
end;

SERVICE_CONTROL_SHUTDOWN: begin
if not ReportStatusToSCMgr(SERVICE_STOP_PE NDING, NO_ERROR, 0) then
ErrorLog('ServiceCtrlHandler SERVICE_STOP_PENDING : '+GetErrosString);
while (Status.dwCurrentState = SERVICE_STOP_PENDING) do sleep(100);
end;
end;
end;

function ServiceThread(P: Pointer): DWORD; stdcall;
var h: thandle;
s: string;
begin
if not ReportStatusToSCMgr(SERVICE_RUNNING , NO_ERROR, 0) then begin
ErrorLog('ServiceThread SERVICE_RUNNING : '+GetErrosString);
result:= GetLastError;
exit
end;

try
while (Status.dwCurrentState <> SERVICE_STOP_PENDING) do begin
ErrorLog('');
sleep(700);

...
ТУТ ТВОЙ ОБРАБОТЧИК
...

end;
result:= 0
finally Status.dwCurrentState:= SERVICE_STOP end
end;

procedure ServiceProc(argc : DWORD;var argv : array of PChar) stdcall;
begin
Status.dwServiceType:= SERVICE_WIN32;
Status.dwServiceSpecificExitCode:= 0;

hServStatus:= RegisterServiceCtrlHandler(SERVICE_ NAME, @ServiceCtrlHandler);
if hServStatus = 0 then begin
ErrorLog('ServiceProc RegisterServiceCtrlHandler : '+GetErrosString);
if not ReportStatusToSCMgr(SERVICE_STOPPED , GetLastError, 0) then
ErrorLog('ServiceProc RegisterServiceCtrlHandler SERVICE_STOPPED : '+GetErrosString);
exit;
end;

if not ReportStatusToSCMgr(SERVICE_START_P ENDING, NO_ERROR, 0) then begin
ErrorLog('ServiceProc SERVICE_START_PENDING : '+GetErrosString);
exit;
end;

hThread:= CreateThread(nil, 0, @ServiceThread, nil, 0, ThID);
WaitForSingleObject(hThread, INFINITE);
CloseHandle(hThread);

if not ReportStatusToSCMgr(SERVICE_STOPPED , NO_ERROR, 0) then
ErrorLog('ServiceProc SERVICE_STOPPED : '+GetErrosString);
end;

function Start: boolean; stdcall;
var
ServTable: array [0..1] of SERVICE_TABLE_ENTRYA;
begin
ServTable[0].lpServiceName:= SERVICE_NAME;
ServTable[0].lpServiceProc:= @ServiceProc;
ServTable[1].lpServiceName:= nil;
ServTable[1].lpServiceProc:= nil;
if not StartServiceCtrlDispatcher(ServTabl e[0]) then begin
ErrorLog('Start StartServiceCtrlDispatcher : '+GetErrosString);
result:= false;
end else result:= true;
end;

function RunService: boolean; stdcall;
var pParameters: PChar;
begin
result:= false;
//
hSCM:= OpenSCManager(nil, nil, GENERIC_READ or GENERIC_EXECUTE);
if hSCM = 0 then begin
ErrorLog('RunService OpenSCManager : '+GetErrosString);
exit
end;
hService:= OpenService(hSCM, SERVICE_NAME, SERVICE_ALL_ACCESS);
if hService = 0 then begin
ErrorLog('RunService OpenService : '+GetErrosString);
CloseServiceHandle(hSCM);
exit
end;
if not StartService(hService, 0, pParameters) then
ErrorLog('RunService StartService : '+GetErrosString);
//
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
result:= true
end;



begin

if ParamCount > 0 then begin
if UpperCase(ParamStr(1)) = 'I' then begin
if Install then begin
ErrorLog('Service Installed');
if RunService then ErrorLog('Service Run')
else ErrorLog('Service Error on Run');
end else ErrorLog('Error on install');
end;
if UpperCase(ParamStr(1)) = 'U' then begin
if UnInstall then ErrorLog('Service UnInstalled')
else ErrorLog('Error on UnInstall');
end;
if UpperCase(ParamStr(1)) = 'G' then begin
if GetData then ErrorLog('List Services Created')
else ErrorLog('Error on List Services');
end;
exit;
end;
Start

end.
...
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 29.09.2009 в 20:34.
raxp вне форума Ответить с цитированием
Старый 29.09.2009, 20:56   #6
Basketman
Пользователь
 
Регистрация: 29.01.2009
Сообщений: 16
По умолчанию

Извините, а чем лучше? По крайнер мере не проще точно. Тут неделю надо сидеть разбираться, чтобы хоть как-то понять, как ваш пример работает.

А не могли бы подсказать мне как сделать, чтобы тупо таймер работал как должен и все, с помощью стандартного метода создания служб (file >> new >> SA)
Basketman вне форума Ответить с цитированием
Старый 12.07.2010, 13:05   #7
loader
Новичок
Джуниор
 
Регистрация: 22.06.2009
Сообщений: 1
По умолчанию

Basketman,
ты так добился или нет результата, а то у меня тоже такая проблема: инсталирую службу, и таимер работает. но как только нажимаю ок, все прекращается работа таимера... Уже в нете несколько джней сижу все не могу наити ответа, кто что говорит, на вопросы дать исходника рабочего все отнекиваюся....
loader вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы со службой! Basketman Общие вопросы Delphi 1 11.09.2009 16:31
Помогите со службой. Никки Общие вопросы Delphi 3 25.01.2009 22:50
проблема с delphi 8 Assassin Общие вопросы Delphi 5 17.09.2008 15:22
проблема с службой Pitbull Работа с сетью в Delphi 6 22.06.2008 19:08
Проблема со службой... =LeonZone= Win Api 10 03.11.2007 14:21