Delphi 仅在知道服务名称的情况下获取其内存信息
有没有办法只知道服务应用程序的服务名称就可以得到它使用了多少内存?我没有特定于delphi的代码来实现这一点,但我可以告诉您windows api调用什么来实现这一点(特别是toolhelp dll调用)。为此,您需要知道exe的名称(不确定是否适合您)Delphi 仅在知道服务名称的情况下获取其内存信息,delphi,memory-management,service,delphi-2010,Delphi,Memory Management,Service,Delphi 2010,有没有办法只知道服务应用程序的服务名称就可以得到它使用了多少内存?我没有特定于delphi的代码来实现这一点,但我可以告诉您windows api调用什么来实现这一点(特别是toolhelp dll调用)。为此,您需要知道exe的名称(不确定是否适合您) 使用createtoolhelp32snapshot,然后使用process32first和process32next查找进程ID 通过将进程id传递给OpenProcess 将进程句柄传递给GetProcessMemoryInfo。这将用您要
我没有特定于delphi的代码来执行此操作,但我可以告诉您要执行哪些windows api调用(特别是toolhelp dll调用)。为此,您需要知道exe的名称(不确定是否适合您)
首先,必须使用函数或WMI类检索与服务关联的进程的Pid,然后才能使用函数收集进程的内存使用信息 检查此示例应用程序
{$APPTYPE CONSOLE}
uses
ActiveX,
ComObj,
Variants,
Windows,
psApi,
SysUtils;
function GetPidFromService(const ServiceName : string) : DWORD;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT ProcessId FROM Win32_Service Where Name="%s"',[ServiceName]),'WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
if oEnum.Next(1, FWbemObject, iValue) = 0 then
Result:=FWbemObject.ProcessId;
end;
procedure MemoryInfoService(const ServiceName : string);
var
hProcess : THandle;
ppsmemCounters: PPROCESS_MEMORY_COUNTERS;
cb: DWORD;
begin
hProcess := OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION, False, GetPidFromService(ServiceName));
if hProcess <> 0 then
try
cb:=SizeOf(PROCESS_MEMORY_COUNTERS);
GetMem(ppsmemCounters, cb);
try
if GetProcessMemoryInfo( hProcess, ppsmemCounters, cb) then
begin
Writeln( Format('PageFaultCount: %d',[ ppsmemCounters.PageFaultCount]));
Writeln( Format('PeakWorkingSetSize: %d',[ ppsmemCounters.PeakWorkingSetSize]));
Writeln( Format('WorkingSetSize: %d',[ ppsmemCounters.WorkingSetSize]));
Writeln( Format('QuotaPeakPagedPoolUsage: %d',[ ppsmemCounters.QuotaPeakPagedPoolUsage]));
Writeln( Format('QuotaPagedPoolUsage: %d',[ ppsmemCounters.QuotaPagedPoolUsage]));
Writeln( Format('QuotaPeakNonPagedPoolUsage: %d',[ ppsmemCounters.QuotaPeakNonPagedPoolUsage]));
Writeln( Format('PagefileUsage: %d',[ ppsmemCounters.PagefileUsage]));
Writeln( Format('PeakPagefileUsage: %d',[ ppsmemCounters.PeakPagefileUsage]));
end;
finally
FreeMem(ppsmemCounters);
end;
finally
CloseHandle(hProcess);
end;
end;
begin
try
CoInitialize(nil);
try
MemoryInfoService('FirebirdGuardianDefaultInstance');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
{$APPTYPE控制台}
使用
ActiveX,
科莫布,
变体,
窗户,
psApi,
SysUtils;
函数GetPidFromService(const ServiceName:string):DWORD;
常数
WbemUser='';
WbemPassword='';
WbemComputer='localhost';
wbemFlagForwardOnly=$00000020;
变量
FSWbemLocator:OLEVariant;
FWMIService:油变型;
FWbemObjectSet:OLEVariant;
FWbemObject:油变异体;
oEnum:IEnumvariant;
伊瓦鲁:长词;
开始
FSWbemLocator:=CreateOleObject('WbemScripting.SWbemLocator');
FWMIService:=FSWbemLocator.ConnectServer(WbemComputer,'root\CIMV2',WbemUser,WbemPassword);
FWbemObjectSet:=FWMIService.ExecQuery(格式('SELECT ProcessId FROM Win32_Service Where Name=“%s]”,[ServiceName]),'WQL',wbemFlagForwardOnly);
oEnum:=IUnknown(FWbemObjectSet.\u NewEnum)作为IEnumVariant;
如果oEnum.Next(1,FWbemObject,iValue)=0,则
结果:=FWbemObject.ProcessId;
终止
过程MemoryInfo服务(const ServiceName:string);
变量
hproces:THandle;
ppsmemCounters:PPProcess\u MEMORY\u计数器;
cb:DWORD;
开始
hProcess:=OpenProcess(PROCESS_VM_READ或PROCESS_QUERY_INFORMATION,False,GetPidFromService(ServiceName));
如果hProcess为0,则
尝试
cb:=SizeOf(进程内存计数器);
GetMem(ppsmemCounters,cb);
尝试
如果GetProcessMemoryInfo(HPProcess、ppsmemCounters、cb),则
开始
Writeln(格式('PageFaultCount:%d',[ppsmemCounters.PageFaultCount]);
Writeln(格式('PeakWorkingSetSize:%d',[ppsmemCounters.PeakWorkingSetSize]);
Writeln(格式('WorkingSetSize:%d',[ppsmemCounters.WorkingSetSize]);
Writeln(格式('QuotaPeakPagedPoolUsage:%d',[ppsmemCounters.QuotaPeakPagedPoolUsage]);
Writeln(格式('QuotaPagedPoolUsage:%d',[ppsmemCounters.QuotaPagedPoolUsage]);
Writeln(格式('QuotaPeakNonPagedPoolUsage:%d',[ppsmemCounters.QuotaPeakNonPagedPoolUsage]);
Writeln(格式('PagefileUsage:%d',[ppsmemCounters.PagefileUsage]);
Writeln(格式('PeakPagefileUsage:%d',[ppsmemCounters.PeakPagefileUsage]);
终止
最后
FreeMem(ppsmounters);
终止
最后
CloseHandle(hProcess);
终止
终止
开始
尝试
共初始化(零);
尝试
MemoryInfoService('FirebirdGuardianDefaultInstance');
最后
协商初始化;
终止
除了
关于E:EOleException do
Writeln(格式('EOleException%s%x',[E.Message,E.ErrorCode]);
关于E:Exception-do
Writeln(E.Classname,“:”,E.Message);
终止
Writeln(“按回车键退出”);
Readln;
终止
首先,必须使用函数或WMI类检索与服务关联的进程的Pid,然后才能使用函数收集进程的内存使用信息
检查此示例应用程序
{$APPTYPE CONSOLE}
uses
ActiveX,
ComObj,
Variants,
Windows,
psApi,
SysUtils;
function GetPidFromService(const ServiceName : string) : DWORD;
const
WbemUser ='';
WbemPassword ='';
WbemComputer ='localhost';
wbemFlagForwardOnly = $00000020;
var
FSWbemLocator : OLEVariant;
FWMIService : OLEVariant;
FWbemObjectSet: OLEVariant;
FWbemObject : OLEVariant;
oEnum : IEnumvariant;
iValue : LongWord;
begin;
FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
FWMIService := FSWbemLocator.ConnectServer(WbemComputer, 'root\CIMV2', WbemUser, WbemPassword);
FWbemObjectSet:= FWMIService.ExecQuery(Format('SELECT ProcessId FROM Win32_Service Where Name="%s"',[ServiceName]),'WQL',wbemFlagForwardOnly);
oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant;
if oEnum.Next(1, FWbemObject, iValue) = 0 then
Result:=FWbemObject.ProcessId;
end;
procedure MemoryInfoService(const ServiceName : string);
var
hProcess : THandle;
ppsmemCounters: PPROCESS_MEMORY_COUNTERS;
cb: DWORD;
begin
hProcess := OpenProcess(PROCESS_VM_READ or PROCESS_QUERY_INFORMATION, False, GetPidFromService(ServiceName));
if hProcess <> 0 then
try
cb:=SizeOf(PROCESS_MEMORY_COUNTERS);
GetMem(ppsmemCounters, cb);
try
if GetProcessMemoryInfo( hProcess, ppsmemCounters, cb) then
begin
Writeln( Format('PageFaultCount: %d',[ ppsmemCounters.PageFaultCount]));
Writeln( Format('PeakWorkingSetSize: %d',[ ppsmemCounters.PeakWorkingSetSize]));
Writeln( Format('WorkingSetSize: %d',[ ppsmemCounters.WorkingSetSize]));
Writeln( Format('QuotaPeakPagedPoolUsage: %d',[ ppsmemCounters.QuotaPeakPagedPoolUsage]));
Writeln( Format('QuotaPagedPoolUsage: %d',[ ppsmemCounters.QuotaPagedPoolUsage]));
Writeln( Format('QuotaPeakNonPagedPoolUsage: %d',[ ppsmemCounters.QuotaPeakNonPagedPoolUsage]));
Writeln( Format('PagefileUsage: %d',[ ppsmemCounters.PagefileUsage]));
Writeln( Format('PeakPagefileUsage: %d',[ ppsmemCounters.PeakPagefileUsage]));
end;
finally
FreeMem(ppsmemCounters);
end;
finally
CloseHandle(hProcess);
end;
end;
begin
try
CoInitialize(nil);
try
MemoryInfoService('FirebirdGuardianDefaultInstance');
finally
CoUninitialize;
end;
except
on E:EOleException do
Writeln(Format('EOleException %s %x', [E.Message,E.ErrorCode]));
on E:Exception do
Writeln(E.Classname, ':', E.Message);
end;
Writeln('Press Enter to exit');
Readln;
end.
{$APPTYPE控制台}
使用
ActiveX,
科莫布,
变体,
窗户,
psApi,
SysUtils;
函数GetPidFromService(const ServiceName:string):DWORD;
常数
WbemUser='';
WbemPassword='';
WbemComputer='localhost';
wbemFlagForwardOnly=$00000020;
变量
FSWbemLocator:OLEVariant;
FWMIService:油变型;
FWbemObjectSet:OLEVariant;
FWbemObject:油变异体;
oEnum:IEnumvariant;
伊瓦鲁:长词;
开始
FSWbemLocator:=CreateOleObject('WbemScripting.SWbemLocator');
FWMIService:=FSWbemLocator.ConnectServer(WbemComputer,'root\CIMV2',WbemUser,WbemPassword);
FWbemObjectSet:=FWMIService.ExecQuery(格式('SELECT ProcessId FROM Win32_Service Where Name=“%s]”,[ServiceName]),'WQL',wbemFlagForwardOnly);
oEnum:=IUnknown(FWbemObjectSet.\u NewEnum)作为IEnumVariant;
如果oEnum.Next(1,FWbemObject,iValue)=0,则
结果:=FWbemObject.ProcessId;
终止
过程MemoryInfo服务(const ServiceName:string);
变量
hproces:THandle;
ppsmemCounters:PPProcess\u MEMORY\u计数器;
cb:DWORD;
开始
hProcess:=OpenProcess(PROCESS_VM_READ或PROCESS_QUERY_INFORMATION,False,GetPidFromService(ServiceName));
如果hProcess为0,则
尝试
cb:=SizeOf(进程内存计数器);
收到