Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
ВнизСервис Найти похожие ветки
← →
Levin_610 © (2006-07-14 12:50) [0]как зарегестрировать программу, как сервис?
← →
sniknik © (2006-07-14 12:53) [1]выполнить с параметром /install (если конечно она написана именно как сервис)
← →
isasa © (2006-07-14 13:03) [2]http://www.ishodniki.ru/art/artshow.php?id=90&cat=1&show=delphi
вот эта штука повторяется в нете n-раз.
Если сделать как там, то, по моему, параметр /i :)
← →
Levin_610 © (2006-07-14 13:22) [3]спасибо
← →
prosto_Maria © (2006-07-14 16:09) [4]там есть функция ServiceInitialization, что она делает и как её описать?
← →
novill © (2006-07-14 16:22) [5]
> prosto_Maria © (14.07.06 16:09) [4]
> там есть функция ServiceInitialization
"Там" - Это где? :)
← →
prosto_Maria © (2006-07-14 16:40) [6]http://www.ishodniki.ru/art/artshow.php?id=90&cat=1&show=delphi
← →
Пусик © (2006-07-14 22:23) [7]
> Levin_610 © (14.07.06 12:50)
srvany.exe из пакета Resouce Kit. Позволит запустить программу как сервис.
http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&DisplayLang=en
либо ищи отдельно 3 файла:
instsrv.exe
srvany.exe
srvany.wri (инструкция).
← →
Leonid Troyanovsky © (2006-07-14 22:41) [8]
> prosto_Maria © (14.07.06 16:40) [6]
Видишь ли, Маша (ничего, если я запросто?)
Для того, чтобы зарегистрировать прилож aka service,
она д.б. написана aka service. О чем уже ранее было и сказано.
Подробности можно найти на
http://rsdn.ru/?article/baseserv/svcadmin-1.xml & etc
--
Regards, LVT.
← →
isasa © (2006-07-14 23:13) [9]prosto_Maria © (14.07.06 16:09) [4]
там есть функция ServiceInitialization, что она делает и как её описать?
Очередной переписчик этой "библии" забыл ее закоментировать. Эта функция может быть написана(а может и нет) пользователем для инициализации каких-нибудь данных сервиса. Показывает место, где это уместно делать. В коментарий ее.
← →
isasa © (2006-07-14 23:19) [10]OFFTOP
Чистое любопытство. Зачем два ника?
Levin_610 ©
prosto_Maria ©
Да еще такие разные?
← →
Leonid Troyanovsky © (2006-07-14 23:21) [11]
> isasa © (14.07.06 23:19) [10]
> Да еще такие разные?
Я могу предложить версии, если ты поделишься
основаниями для идентефикации.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2006-07-14 23:25) [12]
> Leonid Troyanovsky © (14.07.06 23:21) [11]
> Я могу предложить версии, если ты поделишься
> основаниями для идентефикации.
Так основания шиты белыми нитками,
то, делится версиями я не буду, sorry.
--
Regards, LVT.
← →
Levin_610 © (2006-07-17 09:29) [13]у меня почему-то не заходило, под моим ником, а просто_Мария полезный ник), я написал программу, как сервис, но как прописать, чтобы она регистрировалась?
← →
Ketmar © (2006-07-17 10:25) [14]попросить SCM зарегистрировать. %-)
← →
Levin_610 © (2006-07-17 10:27) [15]до этого я уже дошёл, я вроде прошу, но видимо как-то не так)
← →
Fay © (2006-07-17 10:38) [16]2 Levin_610 © (17.07.06 10:27) [15]
Значит не дошёл
← →
Levin_610 © (2006-07-17 10:47) [17]последнее высказывание было необходимо) - я делаю так:
hSCMgr := OpenSCManager(nil, nil, SC_MANAGER_CREATE_SERVICE);
if (hSCMgr <> 0) then
begin
hNewService := CreateService(hSCMgr, PChar(ServiceName), PChar(ServiceName),
STANDARD_RIGHTS_REQUIRED, SERVICE_WIN32_OWN_PROCESS,
SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
PChar(ExecutablePath), nil, nil, nil, nil, nil);
- это все, что нужно, чтобы SCM зарегистрировал службу? или нужно ещё что-то? Или может в этом коде есть ошибка?
← →
isasa © (2006-07-17 10:54) [18]Вот фрагмент болванки _tmain сервиса. На D, к сожалению нет, т.к. не юзаю.
Но идея, думаю, будет понятна. API функции -- те-же. Лежать должен в *.dpr, если не ошибаюсь.
TCHAR srvName[] = _T("DiSpy");
TCHAR srvDispName[] = _T("DiSpy Internet Broadband Router Spyer");
threadDataStruct thData;
int _tmain(int argc, _TCHAR* argv[])
{
...
//Service Installing
if(wcscmp(argv[1],L"/i")==0)
{
wprintf(L"Service installing ...\n");
SC_HANDLE schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); // Open SC Manager
if (NULL == schSCManager)
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
wprintf(L"OpenSCManager failed. (0x%08X)%s\n", dw, lpMsgBuf);
LocalFree(lpMsgBuf);
return 0;
}
SC_HANDLE schService = CreateService(schSCManager, srvName, srvDispName, SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, thData.szPath,
NULL, NULL, NULL, NULL, NULL);
if (schService == NULL)
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
wprintf(L"CreateService failed. (0x%08X)%s\n", dw, lpMsgBuf);
CloseServiceHandle(schSCManager);
LocalFree(lpMsgBuf);
return 0;
}
CloseServiceHandle(schService);
wprintf(L"Service installing succeeded:\n");
wprintf(L"Service display name: \"%s\"\n", srvDispName);
wprintf(L"Service file path: \"%s\"\n", thData.szPath);
return 0;
}
//Service Uninstalling
if(wcscmp(argv[1],L"/u")==0)
{
wprintf(L"Service uninstalling ...\n");
SC_HANDLE schSCManager = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS); // Open SC Manager
if (NULL == schSCManager)
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
wprintf(L"OpenSCManager failed. (0x%08X)%s\n", dw, lpMsgBuf);
LocalFree(lpMsgBuf);
return 0;
}
SC_HANDLE schService = OpenService( schSCManager, srvName, DELETE);
if (schService == NULL)
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
wprintf(L"OpenService failed. (0x%08X)%s\n", dw, lpMsgBuf);
CloseServiceHandle(schSCManager);
LocalFree(lpMsgBuf);
return 0;
}
if (!DeleteService(schService))
{
LPVOID lpMsgBuf;
DWORD dw = GetLastError();
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );
wprintf(L"DeleteService failed. (0x%08X)%s\n", dw, lpMsgBuf);
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
LocalFree(lpMsgBuf);
return 0;
}
wprintf(L"DeleteService succeeded.\n");
wprintf(L"Service was deleted without error.\n");
CloseServiceHandle(schSCManager);
CloseServiceHandle(schService);
return 0;
}
...
← →
Fay © (2006-07-17 11:08) [19]2 Levin_610 © (17.07.06 10:47) 17]
>STANDARD_RIGHTS_REQUIRED
SC_MANAGER_CREATE_SERVICE не лучше? И ваще, где анализ результата выполнения CreateService?
← →
Levin_610 © (2006-07-17 11:23) [20]вроде та часть программы у меня написана так же, значит проблема не в этом
← →
Levin_610 © (2006-07-17 11:27) [21]всё есть - CreateServise
← →
Levin_610 © (2006-07-17 11:34) [22]а что нужнопрописать в основной ф-ции function MainServiceThread(p: Pointer): DWORD; stdcall;
var hWinSta, hDesktop, hOldWinSta, hOldDesktop: THandle;
begin
sleep(10);
end;
ещё что-то?
← →
Fay © (2006-07-17 12:00) [23]2 Levin_610 © (17.07.06 11:34) [22]
> что нужнопрописать в основной ф-ции
Предполагается, что ты это уже знаешь.
Не парь мозги, возьми готовый класс службы.
← →
Levin_610 © (2006-07-17 12:05) [24]ссылку на какой-нибудь нормальный готовый класс можешь дать?
← →
Levin_610 © (2006-07-17 12:23) [25]пожалуйста
← →
isasa © (2006-07-17 12:31) [26]:)
Если по-простому, то
while exitFlag=0 do begin
<делаем что-то>
Sleep(<скоко надо, если надо>);
end;
Или, если хочешь с ним общаться через WM_<message>, то GetMessage в цикле.
← →
isasa © (2006-07-17 12:33) [27]Судя по вопросам, все-таки, сходи по ссылке
Leonid Troyanovsky © (14.07.06 22:41) [8]
на rsdn.
Наступит просветление. :)
← →
Levin_610 © (2006-07-17 12:52) [28]я прочиталЮ и вроде бы всё нормально в моей программе - надо было идти в футболисты)
← →
Fay © (2006-07-17 14:40) [29]2 Levin_610 © (17.07.06 12:52) [28]
Что возвращает CreateService?
← →
Пусик © (2006-07-17 14:48) [30]
> Levin_610 © (17.07.06 12:05) [24]
> ссылку на какой-нибудь нормальный готовый класс можешь дать?
>
Вот рабочий код.unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs,
ExtCtrls;
type
TThreadTimer=class(TThread)
protected
FS: TFileStream;
procedure Execute; override;
end;
TTwoService = class(TService)
procedure ServiceExecute(Sender: TService);
procedure ServiceStart(Sender: TService; var Started: Boolean);
procedure ServiceStop(Sender: TService; var Stopped: Boolean);
procedure ServiceContinue(Sender: TService; var Continued: Boolean);
procedure ServicePause(Sender: TService; var Paused: Boolean);
private
{ Private declarations }
public
function GetServiceController: TServiceController; override;
{ Public declarations }
end;
var
TwoService: TTwoService;
ThrTimer: TThreadTimer;
implementation
{$R *.DFM}
{TTwoService}
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
TwoService.Controller(CtrlCode);
end;
function TTwoService.GetServiceController: TServiceController;
begin
Result := ServiceController;
end;
procedure TTwoService.ServiceExecute(Sender: TService);
begin
while not terminated do
begin
ServiceThread.ProcessRequests(True);
end;
end;
procedure TTwoService.ServiceStart(Sender: TService; var Started: Boolean);
begin
ThrTimer := TThreadTimer.Create(True);
ThrTimer.FreeOnTerminate := True;
try
if not FileExists("c:\log.tmp") then
begin
ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite);
ThrTimer.FS.Free;
end;
ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmOpenReadWrite or fmShareDenyWrite);
Started := True;
except
ThrTimer.Terminate;
Started := False;
end;
ThrTimer.Resume;
end;
procedure TTwoService.ServiceStop(Sender: TService; var Stopped: Boolean);
begin
ThrTimer.Terminate;
ThrTimer.Resume;
Stopped := True;
end;
procedure TTwoService.ServiceContinue(Sender: TService;
var Continued: Boolean);
begin
ThrTimer.Resume;
Continued := True;
end;
procedure TTwoService.ServicePause(Sender: TService; var Paused: Boolean);
begin
ThrTimer.Suspend;
Paused := True;
end;
{ TThreadTimer }
procedure TThreadTimer.Execute;
var
s: String;
begin
while not Terminated do
begin
try
s := FormatDateTime("hh:nn:ss",Now)+#13#10;
FS.Write(s[1],Length(s));
Sleep(1000);
except
end;
end;
FS.Free;
end;
end.
← →
Fay © (2006-07-17 14:54) [31]2 Пусик © (17.07.06 14:48) [30]
if not FileExists("c:\log.tmp") then
begin
ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite);
ThrTimer.FS.Free;
end;
ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmOpenReadWrite or fmShareDenyWrite);
что это за порнография?
← →
Пусик © (2006-07-17 15:12) [32]
> Fay © (17.07.06 14:54) [31]
> 2 Пусик © (17.07.06 14:48) [30]if not FileExists("c:\log.
> tmp") then begin ThrTimer.FS := TFileStream.Create("c:
> \log.tmp",fmCreate or fmShareDenyWrite); ThrTimer.FS.
> Free; end; ThrTimer.FS := TFileStream.Create("c:\log.
> tmp",fmOpenReadWrite or fmShareDenyWrite);что это за порнография?
>
Внимательней код изучай.
← →
DrPass © (2006-07-17 15:14) [33]А почему не
if not FileExists("c:\log.tmp") then
?
ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite)
else
ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmOpenReadWrite or fmShareDenyWrite);
← →
Fay © (2006-07-17 15:18) [34]2 Пусик © (17.07.06 15:12) [32]
> Внимательней код изучай.
Я изучил. Порнография в чистом виде.
← →
Пусик © (2006-07-17 15:29) [35]
> Fay © (17.07.06 15:18) [34]
> 2 Пусик © (17.07.06 15:12) [32]> Внимательней код изучай.
> Я изучил. Порнография в чистом виде
Вот иди и займись ей(порнографией).
> DrPass © (17.07.06 15:14) [33]
Дело в том, что при TFileStream.Create("c:\log.tmp",fmCreate or fmShareDenyWrite) нужный эффект(доступ на чтение из других программ) не будет достигнут.
← →
Пусик © (2006-07-17 15:31) [36]> DrPass © (17.07.06 15:14) [33]
Да и не в том вопрос. Приведен рабочий пример. Как и просил человек.
А все вокруг - излишне.
← →
Игорь Шевченко © (2006-07-17 17:10) [37]Порнография на самом деле находится в SysUtils, не позволяющая передать в функцию FileCreate параметр режима разделения доступа.
← →
Fay © (2006-07-17 17:13) [38]2 Пусик © (17.07.06 15:29) [35]
> Дело в том, что при TFileStream.Create
А CreateFile не судьба?
← →
Пусик © (2006-07-17 17:14) [39]
> Fay © (17.07.06 17:13) [38]
> 2 Пусик © (17.07.06 15:29) [35]> Дело в том, что при TFileStream.
> CreateА CreateFile не судьба?
А прежде подумать, а потом говорить, тоже не судьба?
← →
Игорь Шевченко © (2006-07-17 17:20) [40]
> ThrTimer.FS := TFileStream.Create("c:\log.tmp",fmCreate
> or fmShareDenyWrite);
or fmShareDenyWrite - лишнее. fmCreate равен $FFFF
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.08.06;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.02 c