1、先use TLHelp32, PsAPI,使用其中Process32First的函数和Process32Next遍历所有进程。
2、然后判断是否存在scktsrvr.exe。
3、函数代码:
function checkAppExists(appN: string): Booleanvar
lppe: TProcessEntry32
found : boolean
Hand : THandle
磨羡P:DWORD
s:string
begin
result := false
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0)
found := Process32First(Hand,lppe)
while found do
begin
s := StrPas(lppe.szExeFile)
if lppe.th32ProcessID>0 then
p := lppe.th32ProcessID
else
p := 0
if (s = appN) then
begin
Result:= True
Break
end
found := Process32Next(Hand,lppe)
end
end
4、程序示例,判断scktsrvr.exe是否存在瞎戚拍:
procedure TForm1.btn1Click(Sender: TObject)begin
if checkAppExists('scktsrvr.exe') then
begin
ShowMessage('scktsrvr.exe在运行!')
仔腊end
else
begin
ShowMessage('scktsrvr.exe没有运行!')
end
end
5、效果如下:
我写了一个函数在Windows XP SP2下测试通过,可以直接得到状态字符串调用格式很简单,查看某服务状态的最简单方法:
ShowMessage(GetServiceStatusString('Brower'))
将显示Computer Browser服务的运行情况,Computer Browser服务的服务名称是Browser,还有Remote Procedure Call (RPC)服务的名字是RpcSs,Telnet的服务名称是TlntSvr等等
我没使用过mysql和apache服务,因此我无法知道他们的服务名字,但是你可以开始->运行->services.msc然后在服务列表中找到你要的服务,双击它,第一页的最上边就是服务名称,这是服务自己注如咐册的名称,无论使用什么办法,还是要使用服务名称来区别服务
本函数得到是运行状态字符串,明白了程序原理的话,很容易将它转化成数字返回值,需要的话告诉我.函数是独立的,没有使用类库,不需要控件安装,其实就是API实现的,因此效率最高.
uses
WinSvc //引用此单元
function GetServiceStatusString(sServiceName: string): string
var
hService, hSCManager: SC_HANDLE
SS: TServiceStatus
begin
hSCManager := OpenSCManager(nil, SERVICES_ACTIVE_DATABASE, SC_MANAGER_CONNECT)
if hSCManager = 0 then
begin
result := 'Can not open the service control manager'
exit
end
hService := OpenService(hSCManager, PChar(sServiceName), SERVICE_QUERY_STATUS)
if hService = 0 then
begin
CloseServiceHandle(hSCManager)
result := 'Can not open the service(' + sServiceName + ')'
exit
end
if not QueryServiceStatus(hService, SS) then
result := 'Can not query the service status'
else
begin
case SS.dwCurrentState of
SERVICE_CONTINUE_PENDING:
渣宏纯 绝信 result := 'The service(' + sServiceName + ') continue is pending'
SERVICE_PAUSE_PENDING:
result := 'The service(' + sServiceName + ') pause is pending.'
SERVICE_PAUSED:
result := 'The service(' + sServiceName + ') is paused.'
SERVICE_RUNNING:
result := 'The service(' + sServiceName + ') is running.'
SERVICE_START_PENDING:
result := 'The service(' + sServiceName + ') is starting.'
SERVICE_STOP_PENDING:
result := 'The service(' + sServiceName + ') is stopping.'
SERVICE_STOPPED:
result := 'The service(' + sServiceName + ') is not running.'
else
result := 'Unknown Status'
end
end
CloseServiceHandle(hSCManager)
CloseServiceHandle(hService)
end
function E9FileStatus(Const Origin: string): booleanvar
F: TFileStream
begin
try
try
F := TFileStream.Create(Origin, fmOpenReadWrite OR fmShareExclusive)
Result := true
finally
F.Free
end
except
Result := false
end
end
------------------
fmCreate 根据所给名字创建文件。如果所给名字的文件存在,以写状态打开文件。
fmOpenRead 以只读状态打开文件
fmOpenWrite 以只写状态打开文件。文件全部重写,替代已有内容。
fmOpenReadWrite 打开文件,修改而不是替换文件内容。
共享(share)状态必须是以下值之一:
值 意义
fmShareCompat 共享与文件控制块(FCB)的打开方式兼容。
fmShareExclusive 其他程序不能以弯悄任何理由打开文件。
fmShareDenyWrite 其他程序能以只读方式打开文件,但不能写。
fmShareDenyRead 其他程序能以只写方式打开文件,但不能读。
fmShareDenyNone 不禁春歼止其他程序读或写文件。
如果文扒闹冲件不能被打开, Create 将产生异常。
如果文件未被锁定,将返回true
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)