📄 pdh.pas
字号:
{******************************************************************}
{ }
{ Borland Delphi Runtime Library }
{ Performance Data Helper interface unit }
{ }
{ Portions created by Microsoft are }
{ Copyright (C) 1995-1999 Microsoft Corporation. }
{ All Rights Reserved. }
{ }
{ The original file is: Pdh.pas, released 3 Dec 1999. }
{ The original Pascal code is: Pdh.pas, released 3 Dec 1999. }
{ The initial developer of the Pascal code is Marcel van Brakel }
{ (brakelm@chello.nl). }
{ }
{ Portions created by Marcel van Brakel are }
{ Copyright (C) 1999 Marcel van Brakel. }
{ }
{ Obtained through: }
{ Joint Endeavour of Delphi Innovators (Project JEDI) }
{ }
{ You may retrieve the latest version of this file at the Project }
{ JEDI home page, located at http://delphi-jedi.org }
{ }
{ The contents of this file are used with permission, subject to }
{ the Mozilla Public License Version 1.1 (the "License"); you may }
{ not use this file except in compliance with the License. You may }
{ obtain a copy of the License at }
{ http://www.mozilla.org/NPL/NPL-1_1Final.html }
{ }
{ Software distributed under the License is distributed on an }
{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
{ implied. See the License for the specific language governing }
{ rights and limitations under the License. }
{ }
{******************************************************************}
unit Pdh;
{$WEAKPACKAGEUNIT}
interface
{$HPPEMIT ''}
{$HPPEMIT '#include "pdh.h"'}
{$HPPEMIT ''}
uses
Windows, WinPerf;
type
DWORD_PTR = DWORD;
PDH_STATUS = Longint;
{$EXTERNALSYM PDH_STATUS}
type
// data type definitions
HCOUNTER = THandle;
{$EXTERNALSYM HCOUNTER}
HQUERY = THandle;
{$EXTERNALSYM HQUERY}
HLOG = THandle;
{$EXTERNALSYM HLOG}
PPdhRawCounter = ^TPdhRawCounter;
_PDH_RAW_COUNTER = record
CStatus: DWORD;
TimeStamp: TFileTime;
FirstValue: LONGLONG;
SecondValue: LONGLONG;
MultiCount: DWORD;
end;
{$EXTERNALSYM _PDH_RAW_COUNTER}
TPdhRawCounter = _PDH_RAW_COUNTER;
PPdhRawCounterItemA = ^TPdhRawCounterItemA;
PPdhRawCounterItemW = ^TPdhRawCounterItemW;
PPdhRawCounterItem = PPdhRawCounterItemA;
_PDH_RAW_COUNTER_ITEM_A = record
szName: PAnsiChar;
RawValue: TPdhRawCounter;
end;
{$EXTERNALSYM _PDH_RAW_COUNTER_ITEM_A}
_PDH_RAW_COUNTER_ITEM_W = record
szName: PWideChar;
RawValue: TPdhRawCounter;
end;
{$EXTERNALSYM _PDH_RAW_COUNTER_ITEM_W}
_PDH_RAW_COUNTER_ITEM_ = _PDH_RAW_COUNTER_ITEM_A;
TPdhRawCounterItemA = _PDH_RAW_COUNTER_ITEM_A;
TPdhRawCounterItemW = _PDH_RAW_COUNTER_ITEM_W;
TPdhRawCounterItem = TPdhRawCounterItemA;
PPdhFmtCounterValue = ^TPdhFmtCounterValue;
_PDH_FMT_COUNTERVALUE = record
CStatus: DWORD;
case Longint of
1: (longValue: Longint);
2: (doubleValue: Double);
3: (largeValue: LONGLONG);
4: (AnsiStringValue: LPSTR);
5: (WideStringValue: LPWSTR);
end;
{$EXTERNALSYM _PDH_FMT_COUNTERVALUE}
TPdhFmtCounterValue = _PDH_FMT_COUNTERVALUE;
PPdhFmtCounterValueItemA = ^TPdhFmtCounterValueItemA;
PPdhFmtCounterValueItemW = ^TPdhFmtCounterValueItemW;
PPdhFmtCounterValueItem = PPdhFmtCounterValueItemA;
_PDH_FMT_COUNTERVALUE_ITEM_A = record
szName: PAnsiChar;
FmtValue: TPdhFmtCounterValue;
end;
{$EXTERNALSYM _PDH_FMT_COUNTERVALUE_ITEM_A}
_PDH_FMT_COUNTERVALUE_ITEM_W = record
szName: PWideChar;
FmtValue: TPdhFmtCounterValue;
end;
{$EXTERNALSYM _PDH_FMT_COUNTERVALUE_ITEM_W}
_PDH_FMT_COUNTERVALUE_ITEM_ = _PDH_FMT_COUNTERVALUE_ITEM_A;
TPdhFmtCounterValueItemA = _PDH_FMT_COUNTERVALUE_ITEM_A;
TPdhFmtCounterValueItemW = _PDH_FMT_COUNTERVALUE_ITEM_W;
TPdhFmtCounterValueItem = TPdhFmtCounterValueItemA;
PPdhStatistics = ^TPdhStatistics;
_PDH_STATISTICS = record
dwFormat: DWORD;
Count: DWORD;
min: TPdhFmtCounterValue;
max: TPdhFmtCounterValue;
mean: TPdhFmtCounterValue;
end;
{$EXTERNALSYM _PDH_STATISTICS}
TPdhStatistics = _PDH_STATISTICS;
PPdhCounterPathElementsA = ^TPdhCounterPathElementsA;
PPdhCounterPathElementsW = ^TPdhCounterPathElementsW;
PPdhCounterPathElements = PPdhCounterPathElementsA;
_PDH_COUNTER_PATH_ELEMENTS_A = record
szMachineName: PAnsiChar;
szObjectName: PAnsiChar;
szInstanceName: PAnsiChar;
szParentInstance: PAnsiChar;
dwInstanceIndex: DWORD;
szCounterName: PAnsiChar;
end;
{$EXTERNALSYM _PDH_COUNTER_PATH_ELEMENTS_A}
_PDH_COUNTER_PATH_ELEMENTS_W = record
szMachineName: PWideChar;
szObjectName: PWideChar;
szInstanceName: PWideChar;
szParentInstance: PWideChar;
dwInstanceIndex: DWORD;
szCounterName: PWideChar;
end;
{$EXTERNALSYM _PDH_COUNTER_PATH_ELEMENTS_W}
_PDH_COUNTER_PATH_ELEMENTS_ = _PDH_COUNTER_PATH_ELEMENTS_A;
TPdhCounterPathElementsA = _PDH_COUNTER_PATH_ELEMENTS_A;
TPdhCounterPathElementsW = _PDH_COUNTER_PATH_ELEMENTS_W;
TPdhCounterPathElements = TPdhCounterPathElementsA;
PPdhDataItemPathElementsA = ^TPdhDataItemPathElementsA;
PPdhDataItemPathElementsW = ^TPdhDataItemPathElementsW;
PPdhDataItemPathElements = PPdhDataItemPathElementsA;
_PDH_DATA_ITEM_PATH_ELEMENTS_A = record
szMachineName: PAnsiChar;
ObjectGUID: TGUID;
dwItemId: DWORD;
szInstanceName: PAnsiChar;
end;
{$EXTERNALSYM _PDH_DATA_ITEM_PATH_ELEMENTS_A}
_PDH_DATA_ITEM_PATH_ELEMENTS_W = record
szMachineName: PWideChar;
ObjectGUID: TGUID;
dwItemId: DWORD;
szInstanceName: PWideChar;
end;
{$EXTERNALSYM _PDH_DATA_ITEM_PATH_ELEMENTS_W}
_PDH_DATA_ITEM_PATH_ELEMENTS_ = _PDH_DATA_ITEM_PATH_ELEMENTS_A;
TPdhDataItemPathElementsA = _PDH_DATA_ITEM_PATH_ELEMENTS_A;
TPdhDataItemPathElementsW = _PDH_DATA_ITEM_PATH_ELEMENTS_W;
TPdhDataItemPathElements = TPdhDataItemPathElementsA;
PPdhCounterInfoA = ^TPdhCounterInfoA;
PPdhCounterInfoW = ^TPdhCounterInfoW;
PPdhCounterInfo = PPdhCounterInfoA;
_PDH_COUNTER_INFO_A = record
dwLength: DWORD;
dwType: DWORD;
CVersion: DWORD;
CStatus: DWORD;
lScale: Longint;
lDefaultScale: Longint;
dwUserData: DWORD_PTR;
dwQueryUserData: DWORD_PTR;
szFullPath: PAnsiChar;
Union: record
case Longint of
1: (DataItemPath: TPdhDataItemPathElementsA);
2: (CounterPath: TPdhCounterPathElementsA);
3: (szMachineName: PAnsiChar;
szObjectName: PAnsiChar;
szInstanceName: PAnsiChar;
szParentInstance: PAnsiChar;
dwInstanceIndex: DWORD;
szCounterName: PAnsiChar);
end;
szExplainText: PAnsiChar;
DataBuffer: array[0..0] of DWORD;
end;
{$EXTERNALSYM _PDH_COUNTER_INFO_A}
_PDH_COUNTER_INFO_W = record
dwLength: DWORD;
dwType: DWORD;
CVersion: DWORD;
CStatus: DWORD;
lScale: Longint;
lDefaultScale: Longint;
dwUserData: DWORD_PTR;
dwQueryUserData: DWORD_PTR;
szFullPath: PWideChar;
Union: record
case Longint of
1: (DataItemPath: TPdhDataItemPathElementsW);
2: (CounterPath: TPdhCounterPathElementsW);
3: (szMachineName: PWideChar;
szObjectName: PWideChar;
szInstanceName: PWideChar;
szParentInstance: PWideChar;
dwInstanceIndex: DWORD;
szCounterName: PWideChar);
end;
szExplainText: PWideChar;
DataBuffer: array[0..0] of DWORD;
end;
{$EXTERNALSYM _PDH_COUNTER_INFO_W}
_PDH_COUNTER_INFO_ = _PDH_COUNTER_INFO_A;
TPdhCounterInfoA = _PDH_COUNTER_INFO_A;
TPdhCounterInfoW = _PDH_COUNTER_INFO_W;
TPdhCounterInfo = TPdhCounterInfoA;
PPdhTimeInfo = ^TPdhTimeInfo;
_PDH_TIME_INFO = record
StartTime: LONGLONG;
EndTime: LONGLONG;
SampleCount: DWORD;
end;
{$EXTERNALSYM _PDH_TIME_INFO}
TPdhTimeInfo = _PDH_TIME_INFO;
PPdhRawLogRecord = ^TPdhRawLogRecord;
_PDH_RAW_LOG_RECORD = record
dwStructureSize: DWORD;
dwRecordType: DWORD;
dwItems: DWORD;
RawBytes: array[0..0] of UCHAR;
end;
{$EXTERNALSYM _PDH_RAW_LOG_RECORD}
TPdhRawLogRecord = _PDH_RAW_LOG_RECORD;
PPdhLogServiceQueryInfoA = ^TPdhLogServiceQueryInfoA;
PPdhLogServiceQueryInfoW = ^TPdhLogServiceQueryInfoW;
PPdhLogServiceQueryInfo = PPdhLogServiceQueryInfoA;
_PDH_LOG_SERVICE_QUERY_INFO_A = record
dwSize: DWORD;
dwFlags: DWORD;
dwLogQuota: DWORD;
szLogFileCaption: PAnsiChar;
szDefaultDir: PAnsiChar;
szBaseFileName: PAnsiChar;
dwFileType: DWORD;
dwReserved: DWORD;
Union: record
case Longint of
1: (PdlAutoNameInterval: DWORD;
PdlAutoNameUnits: DWORD;
PdlCommandFilename: PAnsiChar;
PdlCounterList: PAnsiChar;
PdlAutoNameFormat: DWORD;
PdlSampleInterval: DWORD;
PdlLogStartTime: TFileTime;
PdlLogEndTime: TFileTime);
2: (TlNumberOfBuffers: DWORD;
TlMinimumBuffers: DWORD;
TlMaximumBuffers: DWORD;
TlFreeBuffers: DWORD;
TlBufferSize: DWORD;
TlEventsLost: DWORD;
TlLoggerThreadId: DWORD;
TlBuffersWritten: DWORD;
TlLogHandle: DWORD;
TlLogFileName: PAnsiChar);
end;
end;
{$EXTERNALSYM _PDH_LOG_SERVICE_QUERY_INFO_A}
_PDH_LOG_SERVICE_QUERY_INFO_W = record
dwSize: DWORD;
dwFlags: DWORD;
dwLogQuota: DWORD;
szLogFileCaption: PWideChar;
szDefaultDir: PWideChar;
szBaseFileName: PWideChar;
dwFileType: DWORD;
dwReserved: DWORD;
Union: record
case Longint of
1: (PdlAutoNameInterval: DWORD;
PdlAutoNameUnits: DWORD;
PdlCommandFilename: PWideChar;
PdlCounterList: PWideChar;
PdlAutoNameFormat: DWORD;
PdlSampleInterval: DWORD;
PdlLogStartTime: TFileTime;
PdlLogEndTime: TFileTime);
2: (TlNumberOfBuffers: DWORD;
TlMinimumBuffers: DWORD;
TlMaximumBuffers: DWORD;
TlFreeBuffers: DWORD;
TlBufferSize: DWORD;
TlEventsLost: DWORD;
TlLoggerThreadId: DWORD;
TlBuffersWritten: DWORD;
TlLogHandle: DWORD;
TlLogFileName: PWideChar);
end;
end;
{$EXTERNALSYM _PDH_LOG_SERVICE_QUERY_INFO_W}
_PDH_LOG_SERVICE_QUERY_INFO_ = _PDH_LOG_SERVICE_QUERY_INFO_A;
TPdhLogServiceQueryInfoA = _PDH_LOG_SERVICE_QUERY_INFO_A;
TPdhLogServiceQueryInfoW = _PDH_LOG_SERVICE_QUERY_INFO_W;
TPdhLogServiceQueryInfo = TPdhLogServiceQueryInfoA;
//
// Time value constants
//
const
MAX_TIME_VALUE = LONGLONG($7FFFFFFFFFFFFFFF);
{$EXTERNALSYM MAX_TIME_VALUE}
MIN_TIME_VALUE = LONGLONG(0);
{$EXTERNALSYM MIN_TIME_VALUE}
// function definitions
//
// Query Functions
//
var
PdhOpenQuery:function (szDataSource: PChar; dwUserData: DWORD_PTR;
var phQuery: HQUERY): Longint; stdcall;
{$EXTERNALSYM PdhOpenQuery}
PdhAddCounter:function (hQuery: HQUERY; szFullCounterPath: PChar;
dwUserData: DWORD_PTR; var phCounter: HCOUNTER): Longint; stdcall;
{$EXTERNALSYM PdhAddCounter}
PdhCollectQueryData:function (hQuery: HQUERY): Longint; stdcall;
{$EXTERNALSYM PdhCollectQueryData}
PdhRemoveCounter: function (hCounter: HCOUNTER): Longint; stdcall;
{$EXTERNALSYM PdhRemoveCounter}
PdhCloseQuery:function (hQuery: HQUERY): Longint; stdcall;
{$EXTERNALSYM PdhCloseQuery}
//
// Counter Functions
//
PdhGetFormattedCounterValue:function (hCounter: HCOUNTER; dwFormat: DWORD;
lpdwType: LPDWORD; var pValue: TPdhFmtCounterValue): Longint; stdcall;
{$EXTERNALSYM PdhGetFormattedCounterValue}
// dwFormat flag values
const
PDH_FMT_RAW = DWORD($00000010);
{$EXTERNALSYM PDH_FMT_RAW}
PDH_FMT_ANSI = DWORD($00000020);
{$EXTERNALSYM PDH_FMT_ANSI}
PDH_FMT_UNICODE = DWORD($00000040);
{$EXTERNALSYM PDH_FMT_UNICODE}
PDH_FMT_LONG = DWORD($00000100);
{$EXTERNALSYM PDH_FMT_LONG}
PDH_FMT_DOUBLE = DWORD($00000200);
{$EXTERNALSYM PDH_FMT_DOUBLE}
PDH_FMT_LARGE = DWORD($00000400);
{$EXTERNALSYM PDH_FMT_LARGE}
PDH_FMT_NOSCALE = DWORD($00001000);
{$EXTERNALSYM PDH_FMT_NOSCALE}
PDH_FMT_1000 = DWORD($00002000);
{$EXTERNALSYM PDH_FMT_1000}
PDH_FMT_NODATA = DWORD($00004000);
{$EXTERNALSYM PDH_FMT_NODATA}
PERF_DETAIL_COSTLY = DWORD($00010000);
{$EXTERNALSYM PERF_DETAIL_COSTLY}
PERF_DETAIL_STANDARD = DWORD($0000FFFF);
{$EXTERNALSYM PERF_DETAIL_STANDARD}
var LibHandle:HWND;
procedure InitDll;
procedure CloseDll;
implementation
uses Other;
const
PdhLib = 'pdh.dll';
procedure InitDll;
begin
if judgesys in [1,2] then exit;
LibHandle:=LoadLibrary(PdhLib);
if LibHandle<32 then
begin
Exit;
end;
//@PdhGetDllVersion:=GetProcAddress(LibHandle,'PdhGetDllVersion');
@PdhOpenQuery:=GetProcAddress(LibHandle,'PdhOpenQuery');
@PdhAddCounter:=GetProcAddress(LibHandle,'PdhAddCounterA');
@PdhCollectQueryData:=GetProcAddress(LibHandle,'PdhCollectQueryData');
@PdhGetFormattedCounterValue:=GetProcAddress(LibHandle,'PdhGetFormattedCounterValue');
@PdhRemoveCounter:=GetProcAddress(LibHandle,'PdhRemoveCounter');
@PdhCloseQuery:=GetProcAddress(LibHandle,'PdhCloseQuery');
if (@PdhOpenQuery=nil) or (@PdhAddCounter=nil) or (@PdhCollectQueryData=nil) or
(@PdhGetFormattedCounterValue=nil) or (@PdhRemoveCounter=nil) or (@PdhCloseQuery=nil)
then begin
freeLibrary(LibHandle);
LibHandle:=0;
Exit
end;
end;
procedure CloseDll;
begin
if LibHandle>=32 then
freeLibrary(LibHandle);//:=LoadLibrary(
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -