Delphi 仅在知道服务名称的情况下获取其内存信息

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的名称(不确定是否适合您)

  • 使用createtoolhelp32snapshot,然后使用process32firstprocess32next查找进程ID
  • 通过将进程id传递给OpenProcess
  • 将进程句柄传递给GetProcessMemoryInfo。这将用您要查找的信息(workingSetSize结构成员)填充进程内存计数器结构

  • 我没有特定于delphi的代码来执行此操作,但我可以告诉您要执行哪些windows api调用(特别是toolhelp dll调用)。为此,您需要知道exe的名称(不确定是否适合您)

  • 使用createtoolhelp32snapshot,然后使用process32firstprocess32next查找进程ID
  • 通过将进程id传递给OpenProcess
  • 将进程句柄传递给GetProcessMemoryInfo。这将用您要查找的信息(workingSetSize结构成员)填充进程内存计数器结构
  • 了解流程度量
  • 了解流程度量

  • 首先,必须使用函数或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(进程内存计数器);
    收到