Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

работа с TService [D7, WinXP]


shelest ©   (2004-09-23 17:21:00) 

Если кто работал с компонентой TService, скажите почему она не позволяет производить изменения в системе(запись в реестре, запуск файла и тд.).
Вот код:
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
 SPECTR_Update.Controller(CtrlCode);
end;

function TSPECTR_Update.GetServiceController: TServiceController;
begin
 Result := ServiceController;
end;

procedure TSPECTR_Update.ServiceExecute(Sender: TService);
begin
while not Terminated do begin
 ServiceThread.ProcessRequests(True);
end;

end;

procedure TSPECTR_Update.ServiceStart(Sender: TService;
 var Started: Boolean);
begin
Timer1.Enabled:=True;
end;

procedure TSPECTR_Update.ServiceStop(Sender: TService;
 var Stopped: Boolean);
begin
 Timer1.Enabled:=False;
end;

procedure TSPECTR_Update.Timer1Timer(Sender: TObject);
var
local_ver, distr_ver:cardinal;
si:STARTUPINFO;
pi:PROCESS_INFORMATION;

begin
 local_ver:=GetFileVersion('C:\RAY\bin\VDClientKernel.dll');
 distr_ver:=GetFileVersion('\\spectr\newspectr$\bin\VDClientKernel.dll');
 ZeroMemory(@si,sizeof(si));
 si.cb:=SizeOf(si);
 CreateProcess( nil, // No module name (use command line).
 'C:\WINDOWS\regedit.exe',// Command line.
 nil,             // Process handle not inheritable.
 nil,             // Thread handle not inheritable.
 False,           // Set handle inheritance to FALSE.
 0,               // No creation flags.
 nil,             // Use parent's environment block.
 nil,             // Use parent's starting directory.
 si,              // Pointer to STARTUPINFO structure.
 pi );             // Pointer to PROCESS_INFORMATION structure.

beep;
end;

Может я что неправильно делаю?


Digitman   (2004-09-28 16:26:00) [1]


> t'Ice   (28.09.04 15:37) [5]
> ServiceThread.ProcessRequests(False);
> так будет правильно.


глупости


t'Ice   (2004-09-28 15:37:00) [2]

ServiceThread.ProcessRequests(False);
так будет правильно.


Erik1   (2004-09-24 16:46:00) [3]

Ну и изврат, я бы так недогодался. :)
А почему бы тебе в ServiceExecute всю работу невполнить? К томуже либо ты используеш ServiceExecute либо работаеш на событиях ServiceStart ServiceStop.
 Я запускал свой тред в ServiceStart и там работал, в этом подходе есть большой плюс. Очень удобно отлаживать в отдельном проекте.


Digitman   (2004-09-24 10:17:00) [4]


> shelest


ты в курсе, что CreateProcess - функция ? почему не анализируешь рез-т ее выполнения ? хотя бы в целях отладки ?

таймер у тебя как создается ? ты просто бросил TTimer на модуль данных сервиса ? если так, то обработчик TSPECTR_Update.Timer1Timer должен вызываться в осн.трэде процесса сервиса, в то время как обращение к его св-ву Enabled происходит в доп.трэде ServiceThread, и это неверно, потому что трэды эти никак не синхронизированы - сервис в ответ на стоп-контроллер установит Timer.Enabled := False и тут же завершается, в то время как в этот момент обработчик события OnTimer может еще выполняться


shelest   (2004-09-24 09:00:00) [5]

To Digitman ©

Это просто проверка.
Я могбы там и ноутпад загрузить.
Просто хотел узнать запустится приложение или нет.
Так вот оно не запустилось.

P. S. А про TRegistry я знаю :)


Digitman   (2004-09-23 17:48:00) [6]

1. Очисть обработчик ServiceStart() - бестолково совершенно
2. Что за блажь - по тику таймера стартовать аж целый процесс regedit, в то время как модификация реестра - примитивнейший алгоритм с непоср.использованием соотв.WinAPI-функций ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо