ممنون دوست عزیز.
امروز وقت کردم ، فایل و مقالتون رو دیدم و خوندم.
اول از همه باید تشکر کنم ازت ، بابت وقتی که گزاشتی .
بریم سراغ انتقاد :
خیلی نکته قابل اصلاح داشت این مقاله (اما در کل خوب بود)
در قسمتی از این مقاله نوشتید
در ساخت اين سرويس ، نياز به يك تايمر داريم ، مي دانيد كه استفاده از تايمر بسيار ساده است كافيست يك كنترل از نوع تايمر در صفحه قرار داده و خاصيت interval آن را ست نماييد اما متاسفانه شما نمي
توانيد از اين كنترل در Windows Service ها استفاده كنيد ، اين يكي از كليدي ترين نكات ساخت سرويس هاي ويندوز است
این موضوع رو شما بر چه اساسی نوشتید؟ من در چندین پروژه از تایمر در سرویس هام دارم استفاده میکنم و به خوبی و بدون مشکل داره کار میکنه. حتی خودتون تو سمپل اول از شی تایمر استفاده کردید.
نکته بعدی : در سمپلی که در فایل pdf گزاشتید . اومدید بدون اینکه شی تایمر رو بسازید بهش ایونت و خاصیت دادید . (خوابت میومده ، هر چی شده نوشتیا :))
نکته بعدی : اصلا این برنامه ای که نوشتی رو خودت اجرا کردی؟
ShowMessage ی که نوشتی رو اصلا خودت ، تونستی ببینی؟
سعی کنید مقاله رو دوباره بخونید و اصلاح کنید .
کدهای زیر در رابطه با کارکرد سرویس هاست. میتونی بعد از اصلاح مقاله این کد ها رو درش جا بدی.
من اگه جای شما باشم. چون شروع به نوشتن این مقاله کردید ، و جهت کاملتر و بی عیب شدنش از لینک زیر کمک میگرفتم و ازش استفاده میکردم.
https://barnamenevis.org/showthread.p...7160#post67160
نصب سرویس :
procedure InstallService(ServiceName, DisplayName: pchar; FileName: string);
var
SCManager: SC_HANDLE;
Service: SC_HANDLE;
Args: pchar;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager = 0 then Exit;
try
Service := CreateService(SCManager, ServiceName, DisplayName, SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS or SERVICE_INTERACTIVE_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, pchar(FileName), nil, nil, nil, nil, nil);
Args := nil;
StartService(Service, 0, Args);
CloseServiceHandle(Service);
finally
CloseServiceHandle(SCManager);
end;
end;
حذف سرویس :
procedure UninstallService(ServiceName: pchar);
var
SCManager: SC_HANDLE;
Service: SC_HANDLE;
begin
SCManager := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
if SCManager = 0 then Exit;
try
Service := OpenService(SCManager, ServiceName, SERVICE_ALL_ACCESS);
ControlService(Service, SERVICE_CONTROL_STOP, Status);
DeleteService(Service);
CloseServiceHandle(Service);
finally
CloseServiceHandle(SCManager);
end;
end;
استارت سرویس :
function ServiceStart(sMachine,sService : string ) : boolean;
var
schm,schs : SC_Handle;
ss : TServiceStatus;
psTemp : PChar;
dwChkP : DWord;
begin
ss.dwCurrentState := 0;
schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNE CT);
if(schm > 0)then
begin
schs := OpenService(schm,PChar(sService),SERVICE_START or SERVICE_QUERY_STATUS);
if(schs > 0)then
begin
psTemp := Nil;
if(StartService(schs,0,psTemp))then
begin
if(QueryServiceStatus(schs,ss))then
begin
while(SERVICE_RUNNING <> ss.dwCurrentState)do
begin
dwChkP := ss.dwCheckPoint;
Sleep(ss.dwWaitHint);
if(not QueryServiceStatus(schs,ss))then
begin
break;
end;
if(ss.dwCheckPoint < dwChkP)then
begin
break;
end;
end;
end;
end;
CloseServiceHandle(schs);
end;
CloseServiceHandle(schm);
end;
Result := SERVICE_RUNNING = ss.dwCurrentState;
end;
استوپ سرویس :
function ServiceStop(sMachine,sService : string ) : boolean;
var
schm,schs : SC_Handle;
ss : TServiceStatus;
dwChkP : DWord;
begin
schm := OpenSCManager(PChar(sMachine),Nil,SC_MANAGER_CONNE CT);
if(schm > 0)then
begin
schs := OpenService(schm,PChar(sService),SERVICE_STOP or SERVICE_QUERY_STATUS);
if(schs > 0)then
begin
if(ControlService(schs,SERVICE_CONTROL_STOP,ss))th en
begin
if(QueryServiceStatus(schs,ss))then
begin
while(SERVICE_STOPPED <> ss.dwCurrentState)do
begin
dwChkP := ss.dwCheckPoint;
Sleep(ss.dwWaitHint);
if(not QueryServiceStatus(schs,ss))then
begin
break;
end;
if(ss.dwCheckPoint < dwChkP)then
begin
break;
end;
end;
end;
end;
CloseServiceHandle(schs);
end;
CloseServiceHandle(schm);
end;
Result := SERVICE_STOPPED = ss.dwCurrentState;
end;
به دست آوردن وضعیت سرویس :
function ServiceGetStatus(sMachine, sService: PChar): DWORD;
{******************************************}
{*** Parameters: ***}
{*** sService: specifies the name of the service to open
{*** sMachine: specifies the name of the target computer
{*** ***}
{*** Return Values: ***}
{*** -1 = Error opening service ***}
{*** 1 = SERVICE_STOPPED ***}
{*** 2 = SERVICE_START_PENDING ***}
{*** 3 = SERVICE_STOP_PENDING ***}
{*** 4 = SERVICE_RUNNING ***}
{*** 5 = SERVICE_CONTINUE_PENDING ***}
{*** 6 = SERVICE_PAUSE_PENDING ***}
{*** 7 = SERVICE_PAUSED ***}
{******************************************}
var
SCManHandle, SvcHandle: SC_Handle;
SS: TServiceStatus;
dwStat: DWORD;
begin
dwStat := 0;
// Open service manager handle.
SCManHandle := OpenSCManager(sMachine, nil, SC_MANAGER_CONNECT);
if (SCManHandle > 0) then
begin
SvcHandle := OpenService(SCManHandle, sService, SERVICE_QUERY_STATUS);
// if Service installed
if (SvcHandle > 0) then
begin
// SS structure holds the service status (TServiceStatus);
if (QueryServiceStatus(SvcHandle, SS)) then
dwStat := ss.dwCurrentState;
CloseServiceHandle(SvcHandle);
end;
CloseServiceHandle(SCManHandle);
end;
Result := dwStat;
end;
function ServiceRunning(sMachine, sService: PChar): Boolean;
begin
Result := SERVICE_RUNNING = ServiceGetStatus(sMachine, sService);
end;
به دست آوردن لیست سرویسهای فعال بر روی سیستم.
const
SERVICE_KERNEL_DRIVER = $00000001;
SERVICE_FILE_SYSTEM_DRIVER = $00000002;
SERVICE_ADAPTER = $00000004;
SERVICE_RECOGNIZER_DRIVER = $00000008;
SERVICE_DRIVER =
(SERVICE_KERNEL_DRIVER or
SERVICE_FILE_SYSTEM_DRIVER or
SERVICE_RECOGNIZER_DRIVER);
SERVICE_WIN32_OWN_PROCESS = $00000010;
SERVICE_WIN32_SHARE_PROCESS = $00000020;
SERVICE_WIN32 =
(SERVICE_WIN32_OWN_PROCESS or
SERVICE_WIN32_SHARE_PROCESS);
SERVICE_INTERACTIVE_PROCESS = $00000100;
SERVICE_TYPE_ALL =
(SERVICE_WIN32 or
SERVICE_ADAPTER or
SERVICE_DRIVER or
SERVICE_INTERACTIVE_PROCESS);
function ServiceGetList(sMachine : string;dwServiceType,dwServiceState : DWord;
slServicesList : TStrings ): boolean;
const
cnMaxServices = 4096;
type
TSvcA = array[0..cnMaxServices]of TEnumServiceStatus;
PSvcA = ^TSvcA;
var
j : integer;
schm : SC_Handle;
nBytesNeeded,
nServices,
nResumeHandle : DWord;
ssa : PSvcA;
begin
Result := false;
schm := OpenSCManager(
PChar(sMachine),
Nil,
SC_MANAGER_ALL_ACCESS);
if(schm > 0)then
begin
nResumeHandle := 0;
New(ssa);
EnumServicesStatus(
schm,
dwServiceType,
dwServiceState,
ssa^[0],
SizeOf(ssa^),
nBytesNeeded,
nServices,
nResumeHandle );
for j := 0 to nServices-1 do
begin
slServicesList.
Add( StrPas(
ssa^[j].lpDisplayName ) );
end;
Result := true;
Dispose(ssa);
// close service control
// manager handle
CloseServiceHandle(schm);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
ServiceGetList( '',SERVICE_WIN32, SERVICE_STATE_ALL, ListBox1.Items )
end;
به دست آوردن مسیر سرویس :
function GetServiceExecutablePath(strMachine: string; strServiceName: string): String;
var
hSCManager,hSCService: SC_Handle;
lpServiceConfig: PQueryServiceConfigW;
nSize, nBytesNeeded: DWord;
begin
Result := '';
hSCManager := OpenSCManager(PChar(strMachine), nil, SC_MANAGER_CONNECT);
if (hSCManager > 0) then
begin
hSCService := OpenService(hSCManager, PChar(strServiceName), SERVICE_QUERY_CONFIG);
if (hSCService > 0) then
begin
QueryServiceConfig(hSCService, nil, 0, nSize);
lpServiceConfig := AllocMem(nSize);
try
if not QueryServiceConfig(
hSCService, lpServiceConfig, nSize, nBytesNeeded) Then Exit;
Result := lpServiceConfig^.lpBinaryPathName;
finally
Dispose(lpServiceConfig);
end;
CloseServiceHandle(hSCService);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.Text:=GetServiceExecutablePath('',Edit1.Text )
end;
موفق باشید.