如何实现win2k任务管理器的功能?

liuyu202 2006-01-12 11:28:21
如何能够实现任务管理器中:应用程序、进程、性能 三个页面的功能?
应该是要用到window 的api,但是我没有用过window的api,不知道如何编程实现!
请大家帮帮忙!
最好给些实例!
...全文
560 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyu202 2006-03-01
  • 打赏
  • 举报
回复
进程页面的怎么实现?
进程遍历容易实现,但是进程的 cpu时间 和 内存使用 这两个指标如何得到?
sinxx1 2006-02-27
  • 打赏
  • 举报
回复
type
TMainForm = class(TForm)
WinMain_StatusBar: TStatusBar;
WinMain_PageControl: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
TabSheet3: TTabSheet;
TabSheet4: TTabSheet;
TabSheet5: TTabSheet;
Stop_Button: TButton;
Change_Button: TButton;
CPUStatus_GroupBox: TGroupBox;
CPU_Shape: TShape;
Process_ListView: TListView;
WinMain_Menu: TMainMenu;
F1: TMenuItem;
O1: TMenuItem;
V1: TMenuItem;
H1: TMenuItem;
PFStatus_GroupBox: TGroupBox;
PFStatus_Shape: TShape;
CPUStatusLog_GroupBox: TGroupBox;
CPUStatusLog_Shape: TShape;
PFStatusLog_GroupBox: TGroupBox;
PFStatusLog_Shape: TShape;
GroupBox1: TGroupBox;
Task_ListView: TListView;
Close_Button: TButton;
GroupBox2: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
GroupBox3: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
GroupBox4: TGroupBox;
Label13: TLabel;
Label14: TLabel;
Label15: TLabel;
Label16: TLabel;
Label17: TLabel;
Label18: TLabel;
GroupBox5: TGroupBox;
Label19: TLabel;
Label20: TLabel;
Label21: TLabel;
Label22: TLabel;
Label23: TLabel;
Label24: TLabel;
Timer1: TTimer;
Lan_GroupBox: TGroupBox;
Lan_ListView: TListView;
Lan_Shape: TShape;
Shape1: TShape;

procedure GetCOMStatus;
procedure GetLanStatus;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private

public

end;



//引入函数
function NtQuerySystemInformation(
SystemPerformanceInformation: ULONG;
pSystemInformationClass: PVOID;
uSystemInformationClass: ULONG;
puReturnLength: PULONG
): NTSTATUS; stdcall;external 'ntdll.dll';

function GetIfTable(
pIfTable: PTMib_IfTable;
pdwSize: PULONG;
bOrder: boolean
): DWORD; stdCall; external 'IPHLPAPI.DLL';

var
MainForm: TMainForm;

implementation


{$R *.dfm}

procedure TMainForm.GetCOMStatus;

var
Status: NTSTATUS;
SysPerfInfo: TSystemPerformanceInformation;
SysBasicInfo:TSystemBasicInformation;
SysCacheInfo:TSystemFileCacheInformation;
PageSize:Single;

begin
status := NtQuerySystemInformation(0, @SysBasicInfo, SizeOf(TSystemBasicInformation), nil);
if status <> 0 then
Exit;
PageSize := SysBasicInfo.uPageSize / 1024;
status := NtQuerySystemInformation(2, @SysPerfInfo, SizeOf(TSystemPerformanceInformation), nil);
if status <> 0 then
Exit;
//内存使用率 = (页面大小 / 1024) * CommittedPages
//MEMUsage := (PageSize shr 10) * SysPerfInfo.CommittedPages;
Label24.Caption := FloatToStr(SysPerfInfo.PagedPoolPages * PageSize + SysPerfInfo.NonPagedPoolPages * PageSize);
Label23.Caption := FloatToStr(SysPerfInfo.PagedPoolPages * PageSize);
Label22.Caption := FloatToStr(SysPerfInfo.NonPagedPoolPages * PageSize);
Label18.Caption := FloatToStr(SysPerfInfo.CommittedPages * PageSize);
Label17.Caption := FloatToStr(SysPerfInfo.CommitLimit * PageSize);
Label16.Caption := FloatToStr(SysPerfInfo.PeakCommitment * PageSize);

Label12.Caption := FloatToStr(SysBasicInfo.uMmNumberOfPhysicalPages * PageSize);
Label11.Caption := FloatToStr(SysPerfInfo.AvailablePages * PageSize);
//Label10.Caption := FloatToStr(SysPerfInfo.ResidentSystemCachePage * PageSize);
status := NtQuerySystemInformation(21, @SysCacheInfo, SizeOf(TSystemFileCacheInformation), nil);
if status <> 0 then
Exit;
Label10.Caption := FloatToStr(SysCacheInfo.uFileCache / 1024);
WinMain_StatusBar.Panels.Items[2].Text := '内存使用: ' + Label18.Caption + 'K / ' + Label17.Caption + 'K';
end;




procedure TMainForm.GetLanStatus;
var
IfRow : TMib_IfRow;
i,Error,TableSize : integer;
pBuf : PChar;
NumEntries : DWORD;
sDescr : string;
Lan_List : Tlistitem;
begin
TableSize := 0;
Error := GetIfTable( PTMib_IfTable( pBuf ), @TableSize, false );
if Error <> ERROR_INSUFFICIENT_BUFFER then
EXIT;
GetMem( pBuf, TableSize );
Error := GetIfTable( PTMib_IfTable( pBuf ), @TableSize, false );
if Error = NO_ERROR then
begin
NumEntries := PTMib_IfTable( pBuf )^.dwNumEntries;
if NumEntries > 0 then
begin
inc( pBuf, SizeOf( NumEntries ) );
for i := 1 to NumEntries do
begin
IfRow := PTMib_IfRow( pBuf )^;
with IfRow do
begin
SetLength( sDescr, dwDescrLen );
move( bDescr, sDescr[1], Length( sDescr ) );
sDescr := trim( sDescr );


Lan_List :=Lan_ListView.Items.Add;
Lan_List.Caption := '';
Lan_List.SubItems.Add(sDescr);
Lan_List.SubItems.Add(Format('%.0f',[(dwInOctets + dwOutOctets) / dwSpeed]) + ' %');
Lan_List.SubItems.Add(Format('%s',[FloatToStr(dwSpeed/1000000) + ' Mbps']));
end;
inc( pBuf, SizeOf( IfRow ) );
end;
end
else begin
////////////
end;
end
else begin
/////ItemList.Add( SysErrorMessage( GetLastError ) );
end;
dec( pBuf, SizeOf( DWORD ) + NumEntries * SizeOf( IfRow ) );
FreeMem( pBuf );
end;


procedure TMainForm.FormCreate(Sender: TObject);
begin
GetCOMStatus;
GetLanStatus;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
GetCOMStatus;
end;

end.


sinxx1 2006-02-27
  • 打赏
  • 举报
回复
//----------
PVM_COUNTERS = ^TVmCounters;
_VM_COUNTERS = packed record
uPeakVirtualSize: ULONG;
uVirtualSize: ULONG;
uPageFaultCount: ULONG;
uPeakWorkingSetSize: ULONG;
uWorkingSetSize: ULONG;
uQuotaPeakPagedPoolUsage: ULONG;
uQuotaPagedPoolUsage: ULONG;
uQuotaPeakNonPagedPoolUsage: ULONG;
uQuotaNonPagedPoolUsage: ULONG;
uPagefileUsage: ULONG;
uPeakPagefileUsage: ULONG;
end;
TVmCounters = _VM_COUNTERS;
VM_COUNTERS = _VM_COUNTERS;

PIO_COUNTERSEX = ^TIoCountersex;
_IO_COUNTERSEX = packed record
ReadOperationCount: LARGE_INTEGER;
WriteOperationCount: LARGE_INTEGER;
OtherOperationCount: LARGE_INTEGER;
ReadTransferCount: LARGE_INTEGER;
WriteTransferCount: LARGE_INTEGER;
OtherTransferCount: LARGE_INTEGER;
end;
TIoCountersex = _IO_COUNTERSEX;
IO_COUNTERSEX = _IO_COUNTERSEX;

PSYSTEM_THREAD_INFORMATION = ^TSystemThreadInfo;
_SYSTEM_THREAD_INFORMATION = packed record
KernelTime: LARGE_INTEGER;
UserTime: LARGE_INTEGER;
CreateTime: LARGE_INTEGER;
WaitTime: DWORD;
pStartAddress: PVOID;
Cid: CLIENT_ID;
Priority: DWORD;
BasePriority: DWORD;
ContextSwitches: DWORD;
ThreadState: DWORD;
WaitReason: DWORD;
uReserved01: DWORD;
end; //$040
TSystemThreadInfo = _SYSTEM_THREAD_INFORMATION;
SYSTEM_THREAD_INFORMATION = _SYSTEM_THREAD_INFORMATION;

PSYSTEM_PROCESS = ^TSystemProcess;
_SYSTEM_PROCESS = packed record
uNext: DWORD;
ThreadCount: DWORD;
Reserved01: LARGE_INTEGER;
Reserved02: LARGE_INTEGER;
Reserved03: LARGE_INTEGER;
CreateTime: LARGE_INTEGER;
UserTime: LARGE_INTEGER;
KernelTime: LARGE_INTEGER;
usName: UNICODE_STRING;
BasePriority: DWORD;
UniqueProcessId: DWORD;
InheritedFromUniqueProcessId: DWORD;
HandleCount: DWORD;
SessionId: DWORD;
Reserved08: DWORD;
VmCounters: VM_COUNTERS;
CommitCharge: DWORD;
end;
TSystemProcess = _SYSTEM_PROCESS;
SYSTEM_PROCESS = _SYSTEM_PROCESS;

PSYSTEM_PROCESS_NT4 = ^TSystemProcessNt4;
_SYSTEM_PROCESS_NT4 = packed record
Process: SYSTEM_PROCESS;
Threads: SYSTEM_THREAD_INFORMATION;
end;
TSystemProcessNt4 = _SYSTEM_PROCESS_NT4;
SYSTEM_PROCESS_NT4 = _SYSTEM_PROCESS_NT4;

PSYSTEM_PROCESS_NT5 = ^TSystemProcessNt5;
_SYSTEM_PROCESS_NT5 = packed record // Windows 2000
Process: SYSTEM_PROCESS; // common members //$000
IoCounters: IO_COUNTERSEX; // see ntddk.h //$088
aThreads: SYSTEM_THREAD_INFORMATION; // thread array //$0B8
end; //$0B8
TSystemProcessNt5 = _SYSTEM_PROCESS_NT5;
SYSTEM_PROCESS_NT5 = _SYSTEM_PROCESS_NT5;

//对应 SystemProcessInformation 5号调用
PSYSTEM_PROCESS_INFORMATION = ^TSystemProcessInformation;
_SYSTEM_PROCESS_INFORMATION = packed record
case Integer of
0: (Process_NT4: SYSTEM_PROCESS_NT4);
1: (Process_NT5: SYSTEM_PROCESS_NT5);
end;
TSystemProcessInformation = _SYSTEM_PROCESS_INFORMATION;
SYSTEM_PROCESS_INFORMATION = _SYSTEM_PROCESS_INFORMATION;

//对应 SystemProcessorPerformanceInformation 8号调用
PSYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = ^TSystemProcessorPerformanceInformation;
_SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = packed record
IdleTime: LARGE_INTEGER;
KernelTime: LARGE_INTEGER;
UserTime: LARGE_INTEGER;
DpcTime: LARGE_INTEGER;
InterruptTime: LARGE_INTEGER;
InterruptCount: DWORD;
dwUnknown1: DWORD;
end;
TSystemProcessorPerformanceInformation = _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION = _SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION;
// 对应 SystemFileCacheInformation 21号调用
PSYSTEM_CACHE_INFORMATION = ^TSystemFileCacheInformation;
_SYSTEM_CACHE_INFORMATION = packed record
uFileCache: ULONG; // bytes
uFileCachePeak: ULONG; // bytes
PageFaultCount: ULONG;
MinimumWorkingSet: ULONG;
MaximumWorkingSet: ULONG;
TransitionSharedPages: ULONG;
TransitionSharedPagesPeak: ULONG;
Reserved: array[0..1] of ULONG;
end;
TSystemFileCacheInformation = _SYSTEM_CACHE_INFORMATION;
SYSTEM_CACHE_INFORMATION = _SYSTEM_CACHE_INFORMATION;



PTMIB_IfRow = ^TMIB_IfRow;
TMIB_IfRow = packed record
wszName: array[1..MAX_INTERFACE_NAME_LEN] of WChar;
dwIndex: DWORD;
dwType: DWORD;
dwMTU: DWORD;
dwSpeed: DWORD;
dwPhysAddrLen: DWORD;
bPhysAddr: array[1..MAXLEN_PHYSADDR] of byte;
dwAdminStatus: DWORD;
dwOperStatus: DWORD;
dwLastChange: DWORD;
dwInOctets: DWORD;
dwInUcastPkts: DWORD;
dwInNUCastPkts: DWORD;
dwInDiscards: DWORD;
dwInErrors: DWORD;
dwInUnknownProtos: DWORD;
dwOutOctets: DWORD;
dwOutUCastPkts: DWORD;
dwOutNUCastPkts: DWORD;
dwOutDiscards: DWORD;
dwOutErrors: DWORD;
dwOutQLen: DWORD;
dwDescrLen: DWORD;
bDescr: array[1..MAXLEN_IFDESCR] of char; //byte;
end;
TMIB_IfArray = array of TMIB_IFRow;
PTMIB_IfTable = ^TMIB_IfTable;
TMIB_IfTable = packed record
dwNumEntries: DWORD;
Table: array[0..ANY_SIZE - 1] of TMIB_IfRow;
end;



Const
STATUS_INFO_LENGTH_MISMATCH = NTSTATUS($C0000004);



sinxx1 2006-02-27
  • 打赏
  • 举报
回复
我现在正在写的,不是很完整,资料来自网络

实现功能:性能叶面的物理内存,认可用量,核心内存,网络叶面的流量统计等
unit WinMain;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, Menus, ImgList, ActnList;
Const
MAX_INTERFACE_NAME_LEN = 256;
MAXLEN_PHYSADDR = 8;
MAXLEN_IFDESCR = 256;
ANY_SIZE = 1;

type
PVOID = Pointer;
NTSTATUS = LongInt;

PUNICODE_STRING = ^TNtUnicodeString;
_UNICODE_STRING = packed record
Length: Word;
MaximumLength: Word;
Buffer: PWideChar;
end;
UNICODE_STRING = _UNICODE_STRING;
TNtUnicodeString = _UNICODE_STRING;

PCLIENT_ID = ^TClientId;
_CLIENT_ID = packed record
UniqueProcess: THandle;
UniqueThread: THandle;
end;
TClientId = _CLIENT_ID;
CLIENT_ID = _CLIENT_ID;

//对应 SystemBasicInformation 0号调用
PSYSTEM_BASIC_INFORMATION = ^TSystemBasicInformation;
_SYSTEM_BASIC_INFORMATION = packed record
dwUnknown1: DWORD;
uKeMaximumIncrement: ULONG;
uPageSize: ULONG; //一个内存页的大小 //2c
uMmNumberOfPhysicalPages: ULONG; //系统管理着多少个页 //28
uMmLowestPhysicalPage: ULONG;
uMmHighestPhysicalPage: ULONG;
uAllocationGranularity: ULONG;
pLowestUserAddress: Pointer;
pMmHighestUserAddress: Pointer;
uKeActiveProcessors: ULONG;
bKeNumberProcessors: BYTE;
bUnknown2: BYTE;
wUnknown3: WORD;
end;
TSystemBasicInformation = _SYSTEM_BASIC_INFORMATION;
SYSTEM_BASIC_INFORMATION = _SYSTEM_BASIC_INFORMATION;

//对应 SystemPerformanceInformation 2号调用
PSYSTEM_PERFORMANCE_INFORMATION = ^TSystemPerformanceInformation;
_SYSTEM_PERFORMANCE_INFORMATION = packed record
liIdleTime: LARGE_INTEGER;
IoReadTransferCount: LARGE_INTEGER;
IoWriteTransferCount: LARGE_INTEGER;
IoOtherTransferCount: LARGE_INTEGER;
IoReadOperationCount: ULONG;
IoWriteOperationCount: ULONG;
IoOtherOperationCount: ULONG;
AvailablePages: ULONG;
CommittedPages: ULONG;
CommitLimit: ULONG;
PeakCommitment: ULONG;
PageFaultCount: ULONG;
CopyOnWriteCount: ULONG;
TransitionCount: ULONG;
CacheTransitionCount: ULONG;
DemandZeroCount: ULONG;
PageReadCount: ULONG;
PageReadIoCount: ULONG;
CacheReadCount: ULONG;
CacheIoCount: ULONG;
DirtyPagesWriteCount: ULONG;
DirtyWriteIoCount: ULONG;
MappedPagesWriteCount: ULONG;
MappedWriteIoCount: ULONG;
PagedPoolPages: ULONG;
NonPagedPoolPages: ULONG;
PagedPoolAllocs: ULONG;
PagedPoolFrees: ULONG;
NonPagedPoolAllocs: ULONG;
NonPagedPoolFrees: ULONG;
FreeSystemPtes: ULONG;
ResidentSystemCodePage: ULONG;
TotalSystemDriverPages: ULONG;
TotalSystemCodePages: ULONG;
NonPagedPoolLookasideHits: ULONG;
PagedPoolLookasideHits: ULONG;
Spare3Count: ULONG;
ResidentSystemCachePage: ULONG;
ResidentPagedPoolPage: ULONG;
ResidentSystemDriverPage: ULONG;
CcFastReadNoWait: ULONG;
CcFastReadWait: ULONG;
CcFastReadResourceMiss: ULONG;
CcFastReadNotPossible: ULONG;
CcFastMdlReadNoWait: ULONG;
CcFastMdlReadWait: ULONG;
CcFastMdlReadResourceMiss: ULONG;
CcFastMdlReadNotPossible: ULONG;
CcMapDataNoWait: ULONG;
CcMapDataWait: ULONG;
CcMapDataNoWaitMiss: ULONG;
CcMapDataWaitMiss: ULONG;
CcPinMappedDataCount: ULONG;
CcPinReadNoWait: ULONG;
CcPinReadWait: ULONG;
CcPinReadNoWaitMiss: ULONG;
CcPinReadWaitMiss: ULONG;
CcCopyReadNoWait: ULONG;
CcCopyReadWait: ULONG;
CcCopyReadNoWaitMiss: ULONG;
CcCopyReadWaitMiss: ULONG;
CcMdlReadNoWait: ULONG;
CcMdlReadWait: ULONG;
CcMdlReadNoWaitMiss: ULONG;
CcMdlReadWaitMiss: ULONG;
CcReadAheadIos: ULONG;
CcLazyWriteIos: ULONG;
CcLazyWritePages: ULONG;
CcDataFlushes: ULONG;
CcDataPages: ULONG;
ContextSwitches: ULONG;
FirstLevelTbFills: ULONG;
SecondLevelTbFills: ULONG;
SystemCalls: ULONG;
end;
TSystemPerformanceInformation = _SYSTEM_PERFORMANCE_INFORMATION;
SYSTEM_PERFORMANCE_INFORMATION = _SYSTEM_PERFORMANCE_INFORMATION;
liuyu202 2006-02-23
  • 打赏
  • 举报
回复
??
liuyu202 2006-02-23
  • 打赏
  • 举报
回复
楼上的大虾 能够给点资料,或者链接 阿!!!
多谢了!
ly_liuyang 2006-02-23
  • 打赏
  • 举报
回复
PSAPI嘛,N多资料的
liuyu202 2006-01-18
  • 打赏
  • 举报
回复
谢谢!
liuyu202 2006-01-18
  • 打赏
  • 举报
回复
楼上能否发一份给我?
邮箱:
liuyu202@etang.com
麻子 2006-01-16
  • 打赏
  • 举报
回复
Windows2000任务管理器的源码我有,你要吗? :)
sdzeng 2006-01-16
  • 打赏
  • 举报
回复
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=1143
http://www.delphibbs.com/keylife/iblog_show.asp?xid=12322
liuyu202 2006-01-16
  • 打赏
  • 举报
回复
pdhStatus := PdhAddCounter ( hq ,
pchar('\Process(QQ)\% Processor Time'),
0,
CounterHandle ) ;
只添加了QQ.exe的计数器, 如何用循环添加所有的进程的计数器?
clasj 2006-01-14
  • 打赏
  • 举报
回复
var
MemoryStatus: TMemoryStatus;
begin
FillChar(MemoryStatus, SizeOf(TMemoryStatus), 0);
GlobalMemoryStatus(MemoryStatus);
Label1.Caption:=IntToStr(MemoryStatus.dwTotalPhys div 1024)+' KB');//物理内存总数
Label2.Caption:=IntToStr(MemoryStatus.dwAvailPhys div 1024)+' KB';//物理内存剩余
Label3.Caption:=IntToStr(MemoryStatus.dwTotalVirtual div 1024)+' KB');//虚拟内存总数
Label4.Caption:=IntToStr(MemoryStatus.dwAvailVirtual div 1024)+' KB';//虚拟内存剩余
end;
clasj 2006-01-14
  • 打赏
  • 举报
回复
内存信息用这个吧:

var
MemoryStatus: TMemoryStatus;
begin
FillChar(MemoryStatus, SizeOf(TMemoryStatus), 0);
GlobalMemoryStatus(MemoryStatus);
for i:=0 to RzTreeView1.Items.Count-1 do
begin
Label1.Caption:=IntToStr(MemoryStatus.dwTotalPhys div 1024)+' KB');//物理内存总数
Label2.Caption:=IntToStr(MemoryStatus.dwAvailPhys div 1024)+' KB';//物理内存剩余
Label3.Caption:=IntToStr(MemoryStatus.dwTotalVirtual div 1024)+' KB');//虚拟内存总数
Label4.Caption:=IntToStr(MemoryStatus.dwAvailVirtual div 1024)+' KB';//虚拟内存剩余
end;
end;
sdzeng 2006-01-14
  • 打赏
  • 举报
回复
Pascal 代码:
==================
implementation

uses pdh;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
hq : HQUERY;
pdhStatus : PDH_STATUS;
CounterHandle : HCOUNTER;
fmtValue : TPdhFmtCounterValue ;
dwctrType : DWORD;
procedure PdhCheck(const Error : Integer);
begin
if Error<> ERROR_SUCCESS then
raise Exception.Create('Error'+IntToHex(8,Error));
end;
begin
hq := 0;
pdhStatus := PdhOpenQuery(nil,0,hq);
PdhCheck(pdhStatus);
try
pdhStatus := PdhAddCounter ( hq ,
pchar('\Process(QQ)\% Processor Time'),
0,
CounterHandle ) ;
PdhCheck(pdhStatus);
pdhStatus := PdhCollectQueryData ( hq ) ;
PdhCheck(pdhStatus);
pdhStatus := PdhGetFormattedCounterValue ( CounterHandle,
PDH_FMT_DOUBLE,
@dwctrType,
fmtValue ) ;
PdhCheck(pdhStatus);
Showmessage(FormatFloat('0.0000000000000',fmtValue.doubleValue));
finally
pdhStatus := PdhCloseQuery (hq) ;
PdhCheck(pdhStatus);
end;
end;
============================================

unit pdh;

interface
uses windows;
type
HCOUNTER = THandle;
HQUERY = THandle;
PDH_STATUS = Longint;
DWORD_PTR = DWORD;
_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;
TPdhFmtCounterValue = _PDH_FMT_COUNTERVALUE;

function PdhOpenQuery(szDataSource: PChar; dwUserData: DWORD_PTR;
var phQuery: HQUERY): Longint; stdcall;

function PdhAddCounter(hQuery: HQUERY; szFullCounterPath: PChar;
dwUserData: DWORD_PTR; var phCounter: HCOUNTER): Longint; stdcall;

function PdhCollectQueryData(hQuery: HQUERY): Longint; stdcall;

function PdhGetFormattedCounterValue(hCounter: HCOUNTER; dwFormat: DWORD;
lpdwType: LPDWORD; var pValue: TPdhFmtCounterValue): Longint; stdcall;

function PdhCloseQuery(hQuery: HQUERY): Longint; stdcall;

const
PDH_FMT_DOUBLE = DWORD($00000200);

implementation

function PdhOpenQuery; external 'pdh.dll' name 'PdhOpenQuery';
function PdhAddCounter; external 'pdh.dll' name 'PdhAddCounterA';
function PdhCollectQueryData; external 'pdh.dll' name 'PdhCollectQueryData';
function PdhGetFormattedCounterValue; external 'pdh.dll' name 'PdhGetFormattedCounterValue';
function PdhCloseQuery; external 'pdh.dll' name 'PdhCloseQuery';

end.
sdzeng 2006-01-14
  • 打赏
  • 举报
回复
在PDH.dll里有一组函数,可以访问windows的性能数据库
用性能计数器可以得到进程的CPU使用率
具体用法参见:

http://www.vckbase.com/document/viewdoc/?id=1434
liuyu202 2006-01-13
  • 打赏
  • 举报
回复
?
sdzeng 2006-01-12
  • 打赏
  • 举报
回复
http://dev.csdn.net/article/73/73632.shtm
里面说的很详细,剩下就是API的用法,你可以去查MSDN或者Windows SDK
liuyu202 2006-01-12
  • 打赏
  • 举报
回复
多谢上面两位的回答!
我现在用EnumWindows/CreateToolhelp32Snapshot的到了进程列表
可是得不到进程的cpu时间和内存使用情况,如何实现任务管理器中性能页面的cpu使用记录和内存使用记录的功能呢?
柯本 2006-01-12
  • 打赏
  • 举报
回复
用 EnumWindows/CreateToolhelp32Snapshot等完全可以实现win2k任务管理器的主要功能
我还有一条途径.可以得到几乎所有系统信息,那就是用WMI(Microsoft®Windows®Management Instrumentation)
参见:
http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/WDdnclinicscripting.mspx
以下是用DELPHI写的得到系统所有进程信息的WMI(显示部分最好自己写一个)

unit wmiu;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

uses
ActiveX, WbemScripting_TLB;
function ADsEnumerateNext(pEnumVariant: IEnumVARIANT; cElements: ULONG;
var pvar: OleVARIANT; var pcElementsFetched: ULONG): HRESULT; safecall; external 'activeds.dll';

procedure DumpWMI_Process(Process: SWBemObject);
var
Enum: IEnumVARIANT;
varArr: OleVariant;
lNumElements: ULong;
SProp: ISWbemProperty;
Prop: OleVariant;
PropName: string;
PropType: string;
PropValue: string;
begin
Form1.Memo1.Lines.Add('+ WMI Path: ' + Process.Path_.Path);
Enum := Process.Properties_._NewEnum as IEnumVariant;
while (Succeeded(ADsEnumerateNext(Enum, 1, VarArr, lNumElements))) and
(lNumElements > 0) do
begin
if Succeeded(IDispatch(varArr).QueryInterface(SWBemProperty, SProp)) and
Assigned(SProp) then
begin
try
PropName := SProp.Name;
Prop := SProp.Get_Value;
PropType := inttostr((VarType(Prop)));
PropValue := VarToStr(Prop);
Form1.Memo1.Lines.Add(' + ' + PropName + '[' + PropType + '] = ' + PropValue);
except
on E: Exception do
begin
// WriteLn(ErrOutput, PropName, ': ', E.Message);
end;
end;
end;
end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
Server: string;
Enum: IEnumVARIANT;
varArr: OleVariant;
lNumElements: ULong;
AName: array[0..255] of Char;
ASize: DWORD;
begin
if (ParamCount = 0) then
begin
Server := '';
ASize := SizeOf(AName) - 1;
if GetComputerName(@AName, ASize) then Server := AName;
end
else
begin
Server := ParamStr(1);
end;
try
Memo1.Lines.BeginUpdate;
Enum := CoSWbemLocator.Create.ConnectServer(Server, 'root\cimv2', '',
'', '', '', 0, nil).ExecQuery('Select * from Win32_Process', 'WQL',
wbemFlagBidirectional, nil)._NewEnum as IEnumVariant;
while (Succeeded(ADsEnumerateNext(Enum, 1, varArr, lNumElements))) and
(lNumElements > 0) do
begin
DumpWMI_Process(IUnknown(varArr) as SWBemObject);
end;
finally
Memo1.Lines.EndUpdate;
end;
end;

end.
////其中,WbemScripting_TLB.pas可从
///http://www.truth4all.org/WbemScripting_TLB.pas
///下载

你要得到系统的其它信息,只要将
'Select * from Win32_Process'
改成你要的

关于WMI得到其它系统信息可见:
http://dev.csdn.net/Develop/article/23%5C23371.shtm


DAEMON Tools Lite (精灵虚拟光驱)是大眼仔最喜欢的一款免费、稳定、方便、优秀的虚拟光驱软件。。安装后会自动在资源管理器生成一个和真实光驱一样的盘符,让您像访问真正光驱一样来访问虚拟光驱。支持Windows 7边栏小工具,方便得对资源进行读取和弹出;支持 Windows7 任务栏jumplist新特性。高级支持人员还可以通过命令方式实现自动化管理。 虚拟光驱精简解锁版 Daemon Tools Lite 中文多语解锁版虚拟光驱精简解锁版 Daemon Tools Lite 中文多语解锁版 选择一个虚拟驱动器然后选择你想安装的光盘映像。在“我的电脑”找到已创建的装有光盘映像的虚拟光驱,开始工作吧!,支持Win9x/win2k/win2003,支持ps,支持加密光盘,装完不需启动即可用。是一个先进的模拟备份并且合并保护盘的软件,可以备份SafeDisc保护的软件,可以打开CUE(CDRWin/DiscDump/Blindread生成的。BIN镜像)、ISO(CDRWin或CDWizard生成的镜像)、CCD(CloneCD生成的。IMG镜像)、BWT(Blindwrite生成的镜像)、CDI、MDS(Alcohol 120%生成的镜像)等这些虚拟光驱的镜像文件(以后将支持更多的格式)。 模拟虚拟的CD/DVD-ROM/HD DVD 和蓝光驱动器 精灵虚拟光驱简洁版使你能够模仿多达4个CD/DVD与同一台电脑。虚拟驱动器将在您的操作系统中如同真的一样展现。 创建光盘映像 使用精灵虚拟光驱简洁版你用可以插入物理CD/DVD-ROM/HD DVD and 蓝光驱动器中的原盘创建ISO和MDS映像文件。或着使用你早期使用其他程序创立的映像。 精灵虚拟光驱 支持系统环境Windows 98、Windows 2000 SP4、Windows XP、Windows 2000 SP4、Windows Vista、Windows Server 2008、Windows 7、Windows Server 2008 R2、Windows 8.1、Windows 10 媒体设备的虚拟化 4个虚拟光驱,能同时加载几个镜像个性化虚拟光驱: 修改光驱号, DVD 区, 等等加载 *.mdx, *.mds/*.mdf, *.iso, *.b5t, *.b6t, *.bwt, *.ccd, *.cdi, *.cue, *.nrg, *.pdi, *.isz光盘镜像到虚拟光驱 基本的备份功能 制作 CD/DVD/Blu-ray光盘的.iso, *.mds/*.mdf和 *.mdx镜像用密码保护镜像压缩或者分离您的镜像管理您的镜像收藏 通过基本的系统集成,简单的用户界面 在系统盘符上能快速访问所有的功能Windows资源管理器能加载镜像为了能自动化,使用强大的命令行界面在 Windows桌面上通过便利的DAEMON Tools小工具就能实现基本的功能
一、启用guest来宾帐户; 二、控制面板→管理工具→本地安全策略→本地策略→用户权利指派里,“从网络访问此计算机”中加入guest帐户,而“拒绝从网络访问这台计算机”中删除guest帐户; 三、我的电脑→工具→文件夹选项→查看→去掉“使用简单文件共享(推荐)”前的勾; 四、设置共享文件夹; 五、控制面板→管理工具→本地安全策略→本地策略→安全选项里,把“网络访问:本地帐户的共享和安全模式”设为“仅来宾-本地用户以来宾的身份验证”(可选,此项设置可去除访问时要求输入密码的对话框,也可视情况设为“经典-本地用户以自己的身份验证”); 六、右击“我的电脑”→“属性”→“计算机名”,该选项卡中有没有出现你的局域网工作组名称,如“work”等。然后单击“网络 ID”按钮,开始“网络标识向导”:单击“下一步”,选择“本机是商业网络的一部分,用它连接到其他工作着的计算机”;单击“下一步”,选择“公司使用没有域的网络”;单击“下一步”按钮,然后输入你的局域网的工作组名,如“work”,再次单击“下一步”按钮,最后单击“完成”按钮完成设置。 访问网上邻居时显示:" windows xp系统访问局域网时显示 "WORKGROUP无法访问.您可能没有权限使用网络资源.请与这台服务器的管理员联系以查明您是否有访问权限.此工作组的服务器的列表当前无法使用." 我用的是xp系统 我也遇到过这样的情况,当时也是着急得不轻,后来看到了以下的内容,照着一步步的做了做,真的好了。内容不少,但是仍然希望你能耐住性子,仔细的看看自己属于那种情况,应该会有所收获。 局域网互访 - [ 网络 ] 我也是类似问题。 以前一个局域网10多台机子互访问。安了蕃茄花园v2.3,感觉主题漂亮,桌面壁纸自动换,很爽。访问局域网计算机没问题。可网内其它机子在工作组内能看到我的机子,但打不开。说什么“没有权限”。所有设置都作了如下改动(网上找的),依然无效,何故?但求高手指点。 “网上邻居”无法互访问题解决方法大全 “网上邻居”无法互访的问题实在是太常见了,无论在学校,网吧还是家里多台电脑联机,都有可能遇到网上邻居无法互访的故展。“网上邻居”无法访问的故障多种多样,总结起来基本上有下面的几个: 1,没有共享资源/共享服务未启用。 症状:电脑与电脑间可以Ping通,但无法访问共享资源,在“计算机管理”中查看“本地共享”后会弹出“没有启动服务器服务”的错误对话框。 解决:在控制面板-管理工具-服务中启动Server服务。并设置“启动类型”为“自动”。 2,IP设置有误。 症状:双机之间无法互Ping,连接用的双绞线经过测试没有问题,没有安装防火墙。 解决:检查两台电脑的IP是否处在同一网段,还有子掩码是否相同。 3,WINXP默认设置不正确。 症状:从WIN98/2000/2003上无法访问另一台WINXP的机器。 解决:在“控制面板”中的“用户帐户”启用Guest帐号。然后在运行中输入secpol.msc启动“本地安全策略”。 本地策略 -> 用户权利指派,打开“从网络访问此计算机”,添加Guest帐户 本地策略 -> 安全选项,禁止"帐户:使用空白密码的本地帐户只允许进行控制台登陆"。 另外有时还会遇到另外一种情况:访问XP的时候,登录对话框中的用户名是灰的,始终是Guest用户,不能输入别的用户帐号。 解决:本地策略 -> 安全选项 -> "网络访问:本地帐户的共享和安全模式",修改为"经典-本地用户以自己的身份验证" 4,系统漏洞修补软件修改了安全策略。 症状:在“网上邻居”中可以看到对方的计算机,但是访问共享时却提示“没有权限访问网络” 解决:在开始菜单运行中输入secpol.msc启动“本地安全策略”,本地策略 -> 用户权利分配,打开“拒绝从网络访问这台计算机”,删除guest用户。 5,防火墙规则。 症状:安装了防火墙(包括WINXP系统自带的防火墙),出现无法Ping通,或者是访问共享资源的时候提示"XXX无法访问"、"您可能没有权限使用网络资源"、"请与这台服务器的管理员联系以查明您是否有访问权限"、"找不到网络路径"等类似的提示。 解决:停止防火墙或者添加局域网的访问规则。 WINXP自带的防火墙:打开控制面板 -> 网络和Internet连接 -> Windows防火墙 -> 例外,勾选“文件和打印机共享”。 6,Win2000/XP与Win98互访 症状:Ping命令可以通过,但无法在“网上邻居”中实现互访。 解决:在WIN2000/XP系统中:控制面板 -> 管理工具 -> 计算机管理 -> 本地用户和组 -> 用户,在Guest帐户上点击鼠标右键,选择属性,在常规项里取消
Windows Sysinternals Suite是微软发布的一套非常强大的免费工具程序集。之前为Winternals公司提供的免费工具,后被微软直接收购。用户使用这套工具程序集将更好处理Windows的各种问题,以及可以帮助用户管理、诊断和解决Windows系统及应用程序故障。是用户实现Windows管理的好帮手。 Windows Sysinternals Suite功能介绍 AccessChk 为了确保创建安全的环境,Windows 管理员通常需要了解特定用户或用户组对文件、目录、注册表项和 Windows 服务等资源具有哪种访问权限。AccessChk 能够通过直观的界面和输出快速回答这些问题。 AccessEnum 这一简单但强大的安全工具可以向您显示,谁可以用何种访问权限访问您系统中的目录、文件和注册表项。使用此工具可查找权限漏洞。 AdExplorer Active Directory Explorer 是一个高级的 Active Directory (AD) 查看器和编辑器。 AdInsight 一种 LDAP(轻型目录访问协议)实时监视工具,旨在对 Active Directory 客户端应用程序进行故障排除。 AdRestore 恢复已删除的 Server 2003 Active Directory 对象。 Autologon 登录过程中跳过密码屏幕。 Autoruns 查看哪些程序被配置为在系统启动和您登录时自动启动。Autoruns 还能够完整列出应用程序可以配置自动启动设置的注册表和文件位置。 BgInfo 此完全可配置程序会自动生成桌面背景,其中包含有关系统的 IP 地址、计算机名称、网络适配器及更多内容的重要信息。 BlueScreen 此屏幕保护程序不仅精确模拟“蓝屏”,而且也模拟重新启动(完成 CHKDSK),并可在 Windows NT 4、Windows 2000、Windows XP、Server 2003 和 Windows 9x 上工作。 CacheSet CacheSet 是一个允许您利用 NT 提供的功能来控制缓存管理器的工作集大小的程序。它与 NT 的所有版本都兼容。 ClockRes 查看系统时钟的分辨率,亦即计时器最大分辨率。 Contig 您是否希望迅速对您频繁使用的文件进行碎片整理?使用 Contig 优化单个的文件,或者创建连续的新文件。 Coreinfo Coreinfo 是一个新的命令行实用工具,可向您显示逻辑处理器与物理处理器之间的映射、NUMA 节点和它们所处的插槽,以及分配给每个逻辑处理器的缓存。 Ctrl2cap 这是一个内核模式的驱动程序,可在键盘类驱动程序上演示键盘输入过滤,以便将 Caps-Lock 转变为控制键。在此级别过滤允许在 NT 刚好要“看到”键之前变换和隐藏键。Ctrl2cap 还显示如何使用 NtDisplayString() 打印初始化蓝屏的消息。 DebugView Sysinternals 的另一个优先程序:此程序截取设备驱动程序对 DbgPrint 的调用和 Win32 程序生成的 OutputDebugString。它允许在不使用活动的调试器的情况下,在本地计算机上或通过 Internet 查看和记录调试会话输出。 Desktops 使用这一新的实用工具可以创建最多四个虚拟桌面,使用任务栏界面或热键预览每个桌面上的内容并在这些桌面之间轻松地进行切换。 Disk2vhd Disk2vhd 可简化从物理系统到虚拟机 (p2v) 的迁移。 DiskExt 显示卷磁盘映射。 Diskmon 此实用工具会捕捉所有硬盘活动,或者在您的系统任务栏中象软件磁盘活动灯一样工作。 DiskView 图形磁盘扇区实用工具。 Disk Usage (DU) 按目录查看磁盘使用情况。 EFSDump 查看加密文件的信息。 Handle 此易用命令行实用工具将显示哪些进程打开了哪些文件,以及更多其他信息。 Hex2dec 将十六进制数字转换为十进制及反向转换。 接合点 创建 Win2K NTFS 符号链接。 LDMDump 转储逻辑磁盘管理器在磁盘上的数据库内容,其中说明了 Windows 2000 动态磁盘的分区情况。 ListDLLs 列出所有当前加载的 DLL,包括加载位置及其版本号。2.0 版将打印已加载模块的完整路径名。 LiveKd 使用 Microsoft 内核调试程序检查真实系统。 LoadOrder 查看设备加载到 WinNT/2K 系统中的顺序。 LogonSessions 列出系统中的活动登录会话。 MoveFile 使您可以安排在系统下一次重新启动时执行移动和删除命令。 NTFSInfo 用 NTFSInfo 可以查看有关 NTFS 卷的详细信息,包括主文件表 (MFT) 和 MFT 区的大小和位置,以及 NTFS 元数据文件的大小。 PageDefrag 对您的分页文件和注册表配置单元进行碎片整理。 PendMoves 枚举在系统下一次启动时所要执行的文件重命名和删除命令的列表。 PipeList 显示系统上的命名管道,包括每个管道的最大实例数和活动实例数。 PortMon 通过高级监视工具监视串行端口和并行端口的活动。它能识别所有的标准串行和并行 IOCTL,甚至可以显示部分正在发送和接收的数据。3.x 版具有强大的新 UI 增强功能和高级筛选功能。 ProcDump 这一新的命令行实用工具旨在捕获其他方式难以隔离和重现 CPU 峰值的进程转储。该工具还可用作用于创建进程转储的一般实用工具,并可以在进程具有挂起的窗口或未处理的异常时监视和生成进程转储。 Process Explorer 找出进程打开了哪些文件、注册表项和其他对象以及已加载哪些 DLL 等信息。这个功能异常强大的实用工具甚至可以显示每个进程的所有者。 Process Monitor 实时监视文件系统、注册表、进程、线程和 DLL 活动。 ProcFeatures 这一小程序会报告处理器和 Windows 对“物理地址扩展”和“无执行”缓冲区溢出保护的支持情况。 PsExec 在远程系统上执行进程。 PsFile 查看远程打开的文件。 PsGetSid 显示计算机或用户的 SID。 PsInfo 获取有关系统的信息。 PsKill 终止本地或远程进程。 PsList 显示有关进程和线程的信息。 PsLoggedOn 显示登录到某个系统的用户。 PsLogList 转储事件日志记录。 PsPasswd 更改帐户密码。 PsService 查看和控制服务。 PsShutdown 关闭并重新启动(可选)计算机。 PsSuspend 挂起和继续进程。 PsTools PsTools 套件包括一些命令行程序,可列出本地或远程计算机上运行的进程、远程运行进程、重新启动计算机、转储事件日志,以及执行其他任务。 RegDelNull 扫描并删除包含嵌入空字符的注册表项,标准注册表编辑工具不能删除这种注册表项。 RegJump 跳至 Regedit 中指定的注册表路径。 RootkitRevealer 扫描系统以找出基于 Rootkit 的恶意软件。 SDelete 安全地覆盖敏感文件,并使用此符合 DoD 的安全删除程序清理先前删除文件所在的可用空间。 ShareEnum 扫描网络上的文件共享并查看其安全设置,以关闭安全漏洞。 ShellRunas 通过方便的 shell 上下文菜单项,作为另一个用户启动程序。 Sigcheck 转储文件版本信息并检查系统中的映像是否已进行数字签名。 Streams 显示 NTFS 备用数据流。 Strings 在二进制映像中搜索 ANSI 和 UNICODE 字符串。 Sync 将缓存数据刷新到磁盘。 TCPView 活动套接字命令行查看器。 VMMap VMMap 是进程虚拟和物理内存分析实用工具。 VolumeId 设置 FAT 或 NTFS 驱动器的卷 ID。 Whois 查看 Internet 地址的所有者。 WinObj 基本对象管理器命名空间查看器。 ZoomIt 在屏幕上进行缩放和绘图的演示实用工具。 Windows Sysinternals Suite截图
SQL Server 2005全文检索技术在网站上的应用实录 http://tech.ddvip.com 2008年01月21日 社区交流 Excel服务器-用Excel做管理系统 关键字: DataGuard checkpoint 动态查询 synonyms 卸载SQL 2005 SQL Server群集 内容摘要:本文提供了网站如何设计和实现基于SQL Server 2005的全文检索实例,希望能对正在使用SQL Server 2005构建网站搜索的同仁有所裨益。 一、前言 “人类失去搜索,世界将会怎样?”,同样,很难想象一个拥有极大信息量的行业网站门户没有站内全文搜索将会出现怎样的局面,网站全文检索对于挖掘网站信息和整合网站资源的价值是不言而喻的。我们看到,通用型的搜索引擎已经成为了互联网世界的门户,而对于一个信息量极其丰富的网站而言,全网搜索或许会成为本网站的门户,正是所谓的门户之门。   实现网站全文检索有几种常见方案,比如应用数据库全文检索,开源搜索引擎,使用Google API等, 本文我们将就如何使用SQL Server 2005多快好省地建立网站全文检索展开探讨。 二、全文检索技术说明   1、应用背景   先介绍下Z网站,它是国内投融资行业最大的行业门户,网站拥有海量的融资信息、投资信息、招商信息、创业信息、商机信息、资讯信息、产权交易信息、招标投标信息、中标信息、会展信息等投融资行业的信息资源。网站全文检索实现的首要需求就在于能够让用户输入诸如行业关键字后系统能快速返回给符合用户在全范围内查找条件的记录, 从而有效地利用资源,更好地满足用户需求。 2、主要检索技术的区别   有了数据但是没有被使用,那么这些数据不应该被称为信息。它们无非是不断充斥设备和网络的比特而已,但是如何把数据挖掘出来提供给需要的人员,检索技术是其中非常有效的途径之一。   现基于微软平台,针对SQL Server 2005提供的全文检索技术进行介绍。与关系数据查询、多维数据库查询和基于XML的XQuery、XPath不同,全文检索技术主要处理对象是基于超大 数据量的文本数据和结构化的二进制数据上类似LIKE的模糊查询。主要区别见下表。    表1:全文检索与关系数据库查询、多维数据查询、XML查询的对比      关系数据库查询 多维数据查询 XML查询 全文检索 检索技术 SQL MDX XQuery、XPath SQL (extension) 主要处理对象 关系二维数据 结构化多维数据 层次型数据 大容量二维和层次型数据的模糊检索 主要应用领域 一般的OLTP类应用 一般的OLAP类分析型应用 面向Internet、Intranet的松散耦合SOA应用 企业/网站内部信息/知识管理类应用 索引 大量使用非聚簇索引,一般保存在数据库中。 通过层次型、保存中间结果的方式,通过不同的轴向快速定位信息剖面。 基于XPath的索引,索引一般保存在数据库中。 基于关键字的索引,保存在文件系统中。每个表仅支持一个索引。   3、全文检索技术简要介绍   全文检索主要应用领域如下:   (1)大数据量、超大数据量的结构化平文本数据和模糊匹配查找(Char、Varchar、Nvarchar)。   (2)大数据量、超大数据量的层次型XML数据展开后的查找---含模糊查找(Xml type)。   (3)标准格式的二进制非结构化Word数据的查找(VarBinary[max]、Image)。   与其他检索技术不同的是,全文检索不仅仅提供词汇层次的查询支持,而且可以根据语言环境、不同语言的特点,甚至于用户自定义的配置提供不同语义级的大容量的数据模糊匹配检索支持。为了提供语义层次的检索,SQL Server 2005的全文检索明确了如下几个概念:   (1)断字符(Word Breaker):因为对于不同的语言,哪些符号可以用于词汇的分割是不同的,因此全文检索支持不同语言环境的不同断字符。   (2)标记(Token):是由断字符标识的词或字符串。由于划分是基于特定语言完成的,因此也可以做到语义层次的支持。   (3)干扰词(Noise Word):主要是那些经常出现,但是对于检索没有多少帮助的词汇。例如:英语中的“a”、 “and”、 “is”、 “the”,汉语中的“的”、 “不”、 “以”、 “了”等。SQL Server 2005中提供配置文件,允许用户自定义自己语言、甚至与本行业、本企业的检索干扰词。   (4)词干分析器(Stemmer):通过断字符分割后,根据具体的语言和该语言的语法规程生成的特定词汇的变形。 这个即是搜索引擎常提到的分词技术。   (5)同义词:即便是同一个语言,在检索的情况下也存在同义词如何处理的问题。如果一个检索系统不能够识别近义词,而只能识别完全匹配的词汇,那对于我们中文这种表义的语言而言会带来很大不便。同样的,一个行业内部也有很多同义词或者是缩略语。例如如下的词语。   广播行业:“ABC”与“英国ABC广播公司”基本上类似,但是也可能和“澳大利亚广播公司”混淆。   政府行文:“ABC”与南美的“阿根廷、巴西、智利三国”是同义词。   不仅如此,由于日常使用的习惯,我们在口语表达和书面语表达上也有区别,这个也需要预先定义。例如,很多口头常用的技术产品“Win2K”、 “WinXP”等,一般都很正式的称为“Windows 2000”和 “Windows XP”,因此SQL Server 2005上也提供类似词汇替换的支持,而且这些支持也是与具体语言相关的。   4、SQL Server 2005全文检索的技术架构   让我们首先得问自己,什么是全文检索?它是指Microsoft SQL Server 2005 具备针对 Microsoft SQL Server 表中基于纯字符的数据进行全文查询的功能。全文查询可以包括词和短语,或者词或短语的多种形式。   当我们明确了全文检索概念之后,我们来看看它的内部结构。   Microsoft SQL Server 2005 中的全文搜索由 Microsoft Full-Text Engine for SQL Server (MSFTESQL) 服务提供支持。MSFTESQL 服务有两个角色,即索引支持和查询支持。   全文搜索的组件   全文搜索的体系结构由下列组件构成:   ◆Microsoft Full-Text Engine for SQL Server (MSFTESQL) ◆Microsoft Full-Text Engine Filter Daemon (MSFTEFD),它包含下列组件: (1)筛选器 (2)协议处理程序 (3)断字符   SQL Server中的全文搜索的体系结构如下所示。    图1   让我们逐一介绍两类重要的引擎及其在整个体系结构中的重要作用。   Full-Text Engine for SQL Server (MSFTESQL)   MSFTESQL 服务负责进行下列操作:   ◆填充全文索引。 ◆管理全文索引和全文目录。 ◆帮助对 SQL Server 数据库中的表进行全文搜索。   让我们来看看SQL Server 2005全文索引的过程   全文填充(也称为爬网或爬虫)开始后,数据库引擎会将大批数据存入内存并通知 Microsoft SQL Server 全文引擎 (MSFTESQL) 服务开始进行索引。MSFTESQL 服务将对表的某一列或几列中的字符和格式化二进制数据编制索引。全文引擎将使用协议处理程序组件从内存中取出数据并进行进一步处理,从而生成全文索引。   对存储在 varbinary(max) 或 image 列中的数据编制索引时,筛选器(实现了 IFilter 接口)将基于为该数据指定的文件格式(例如,Microsoft Word)来提取文本。在某些情况下,筛选器组件会要求将 varbinary(max) 或 image 数据写到服务帐户 Temp 目录中,而不是将其存入内存。   在处理过程中,通过断字符将收集到的文本数据分隔成各个单独的标记或关键字。用于标记化的语言将在列级指定,或者也可以通过筛选器组件在 varbinary(max)、image 或 xml 数据内标识。   还可能执行其他处理以删除干扰词并在将标记存储到全文索引或索引片断中之前将这些标记规范化。   Microsoft Full-Text Engine for SQL Server 的功能   SQL Server 2005 为全文引擎提供了并行安装方式。这意味着对于每个 SQL Server 实例,都存在一个专用的 MSFTESQL 实例,其中包括专用的组件(例如断字符和筛选器)、资源(例如内存)和配置(例如服务级设置,实例级的 resource_usage 是一个更具体的例子)。单个 MSFTESQL 服务实例可管理相关联的 SQL Server 实例的全文索引。利用 MSFESQL 服务,SQL Server 可超出 SQL 标准对字符串列执行更为复杂的搜索。   MSFTESQL 服务担当了以下角色:   索引支持   MSFTESQL 实现了为数据库定义的全文目录和索引。   查询支持   MSFTESQL 可处理全文搜索查询并确定索引中符合全文选择条件的项。对于符合选择条件的每一项,MSFTESQL 将向 SQL Server 服务返回相应行的标识外加一个排名值,而后者将使用这些信息来构造查询结果集。所支持的查询类型包括:   ◆搜索词或短语。 ◆搜索位置邻近的词。 ◆搜索词的变形。   可管理性支持   全文目录和索引不会存储在 SQL Server 数据库中。MSFTESQL 服务负责管理全文目录。   Microsoft Full-Text Engine Filter Daemon   MSFTEFD 由负责从表中访问和筛选数据以及进行断字和词干分析的组件组成。   ◆筛选器   筛选器的任务是从文档中提取文本化信息流,并舍弃所有非文本化信息和格式化信息。筛选器将生成文本字符串和属性/值对,并依次将它们传递给索引引擎。   筛选器可从特定的文档格式(如 Microsoft Word 文档或文本文件)中提取文本化信息。例如,Microsoft 提供了 Microsoft Office 筛选器,此筛选器可以从 Word、Microsoft Excel 和 Microsoft PowerPoint 文件中提取文本和属性。其他筛选器用于处理 HTML 或电子邮件。还可以使用第三方筛选器。   ◆SQL 协议处理程序   在 SQL Server 2005 中,SQL 协议处理程序的工作是从指定数据库中的表内访问数据。   断字符   断字符是用于在查询或抓取的文档中确定字符流中的字符边界位置。有关详细信息。   全文搜索的索引组件负责全文索引的初始填充,以及当全文索引表中的数据被修改时该索引的后续更新。为了提升全文索引过程的效率,Microsoft SQL Server 2005 改进了全文收集机制的体系结构,从而大大增强了性能。 Microsoft Full-Text Engine for SQL Server (MSFTESQL) 服务是一个全文索引和搜索引擎。MSFTESQL 引擎基于 Microsoft Search (MSSearch) 技术,它与 Microsoft SQL Server 2005 Database Engine 进行了最为紧密的集成。   全文引擎作为 MSFTESQL 服务在操作系统上运行。SQL Server 与 MSFTESQL 必须拥有相同的服务帐户。默认情况下将安装 MSFTESQL 服务,但是只有在使用全文搜索时才会运行此项服务。   三、网站全文检索设计   1、架构设计 采用OLTP交易数据库和OLAP数据仓库(用于搜索和分析)分离的模式,OLTP作为OLAP的数据源通过SQL Server Integration Services (SSIS)定期导入到OLAP数据仓库环境中,OLAP采用星型结构以便于更好地满足搜索和将来的数据挖掘。 OLAP数据仓库的建立目标为了检索和数据挖掘,故其事实表的建立可以反范式原则设计。    图2   2、原型设计(由于篇幅限制,这里仅给出搜索主页和主要资源查询页面)    图3   3、数据库设计    图4   4、数据字典   MainInfoTab(信息主表)      CapitalInfoTab(资本信息明细表)      ProjectInfoTab(项目信息明细表)      MerchantInfoTab(政府招商信息明细表)      四、数据库全文检索实现   至此,我们已经完成了全文检索的设计工作,现在可以来实现它的功能啦!   首先, 让我们建立检索表的全文检索,全文检索要求唯一索引,故需要在相关表建立唯一聚集索引。   第二步,使用SQL DDL或者SQL Server Management Studio建立表的全文检索。   1)使数据库支持全文检索。    图5   或者通过键入命令 EXEC SP_FULLTEXT_DATABASE 'Enable' 命令达到同样效果。   2)定义表的全文检索目录和索引字段。   在表的鼠标右键通过点击“全文检索定义全文检索”将弹出如下执行向导,本向导执行完毕则该表的全文检索业已完毕。   a)选择要索引的字段    图6   或者键入如下命令:    CREATE FULLTEXT INDEX ON TableName KEY INDEX PK_IndexName ON DB WITH CHANGE_TRACKING AUTO ALTER FULLTEXT INDEX ON TableName ADD ColumnName   b)选择或创建新的索引目录。    图7   c)定义填充计划。    图8   至此,表的全文索引已经建立完毕,表示只要键入SQL 指令就可以完成全文检索功能。   第三步,开发存储过程并把结果集分页,以供前台页面调用返回查询的结果。   1) 建立找资本全文检索储存过程USP_CaptialInfo_FullIndex。 /* 找资本全文索引开发过程  */ CREATE PROCEDURE USP_CaptialInfo_FullIndex ( @TableViewQueryNameVarchar( 1024 ), --传入的查询字符窜 @SearchKeyword nvarchar(100), --传入的查询关键字 @SelectStr Varchar( 500 ), --选择列字符串 @Criteria Varchar( 8000 ), --查询条件 @Sort Varchar( 255 ), --排序字符串 @FristTopNum int,  --显示的第一页置顶的数目 @Page bigint OUTPUT , --显示的当前页号 @CurrentPageRowbigint,  --页大小(显示多少行)  @TotalCount bigint output, --通过该查询条件,返回的查询记录的总页数 @Totaltimes bigint output --所有搜索时间,以秒为单位 ) as  DECLARE @starttime datetime, @endtime datetime SELECT @starttime = getdate() IF ISNULL(@SearchKeyword,'') !='' OR RTRIM(@SearchKeyword)!='' BEGIN SET @TableViewQueryName = ' SELECT '+ ' ROW_NUMBER() OVER (ORDER BY RANK DESC) AS SerialNumber ,'+ ' F.[rank], '+ ' p.*' + ' FROM'+ ' FREETEXTTABLE( CapitalInfoFactTab , (ProvinceName, CityName,  CountyName, Keyword,Title ,IndustryBName , shortcontent, ComAbout , ComBreif) , '+ ''''+@SearchKeyword+ ''''+') AS f '+ ' INNER JOIN  CapitalInfoFactTab  AS p '+ ' ON f.[key] = p.infoID ' EXEC [USP_GetFrontDataList_ByFullIndex] @TableViewQueryName, @SearchKeyword, @SelectStr, @Criteria, @Sort, @FristTopNum, @Page OUTPUT , @CurrentPageRow , @TotalCount OUTPUT END ELSE BEGIN EXEC dbo.GetFrontDataList 'dbo.ProjectInfoFactTab', 'InfoID', @SelectStr,@Criteria,@Sort,0, @Page output, @CurrentPageRow, @TotalCount output END SELECT @endtime = getdate() SELECT @Totaltimes = DATEdiff(Ms, @starttime ,@endtime) RETURN   2)建立通用分页存过程[USP_GetFrontDataList_ByFullIndex]。由于性能考虑,返回给前台页面需要网站数据库端即完成分页。    CREATE PROCEDURE [dbo].[USP_GetFrontDataList_ByFullIndex] ( @TableViewQueryName Varchar( 1024 ),  --Table或View或者Query的名字或字符串 @Key  Varchar( 50 ), --关键字 @SelectStr  Varchar( 500 ),  --选择列字符串 @Criteria  Varchar( 8000 ),--查询条件 @Sort  Varchar( 255 ), --排序字符串 @FristTopNum  INT,   --显示的第一页置顶的数目 @Page  BIGINT OUTPUT, --显示的当前页号 @CurrentPageRow BIGINT, --页大小(显示多少行) @TotalCount  BIGINT OUTPUT  --通过该查询条件,返回的查询记录的总页数 ) ASSET NOCOUNT ONif charindex(';',@Criteria)>0 or charindex('--',@Criteria)>0 or charindex('/*',@Criteria)>0 or charindex('*/',@Criteria)>0 or charindex('syscolumns',@Criteria)>0 orcharindex('sysfiles',@Criteria)>0 or charindex('char(124)',@Criteria)>0 or charindex('1=1',@Criteria)>0 RETURN DECLARE @TotalStr nVarchar(4000) DECLARE @Str  nVarchar(4000) DECLARE @TopRowNum bigint IF @SelectStr IS NULL AND RTRIM(LTRIM(@Criteria)) = '' SET @SelectStr = '*' IF @FristTopNum IS NULL AND @FristTopNum < 0 BEGIN SET @FristTopNum = 0 END ELSE IF @FristTopNum > @CurrentPageRow BEGIN SET @FristTopNum = @CurrentPageRow ENDIF @CurrentPageRow > 0 BEGIN IF @Criteria IS NOT NULL AND RTRIM(LTRIM(@Criteria)) <> '' BEGIN SET @TotalStr = 'SELECT @TotalCount=COUNT(*) FROM ' +'('+ @TableViewQueryName  +')'+ ' T ' + ' WHERE ' + @Criteria END ELSE BEGIN SET @TotalStr = 'SELECT @TotalCount=COUNT(*) FROM ' +'('+@TableViewQueryName +')'+ ' T ' END PRINT @TotalStr EXEC sp_ExecuteSql @TotalStr, N'@TotalCount bigint output',@TotalCount output SET @TotalCount = @TotalCount + isnull(@FristTopNum ,0) DECLARE @TotalPage bigint SET @TotalPage = @TotalCount/@CurrentPageRow IF @TotalCount%@CurrentPageRow > 0 BEGIN SET @TotalPage = @TotalPage + 1 END IF @Page <= 0 BEGIN SET @Page = 1 END IF @TotalPage > 0 AND @Page > @TotalPage BEGIN SET @Page = @TotalPage END--组织查询语句 SET @Str = 'SELECT  ' +  @SelectStr + ' FROM (' + @TableViewQueryName + ') T WHERE T.SerialNumber >' + cast ((@Page-1) as varchar(10)) + '*' +cast( @CurrentPageRow as varchar(10))+ ' AND T.SerialNumber <= '+ cast (@Page as varchar(10)) + '*' +cast( @CurrentPageRow as varchar(10))IF @Sort IS NOT NULL ANDRTRIM(LTRIM(@Sort)) <> '' BEGIN IF @Criteria IS NOT NULL AND RTRIM(LTRIM(@Criteria)) <> '' BEGIN SET @Str = @Str +  ' AND (' + @Criteria + ') ORDER BY '+@Sort END ELSE BEGIN SET @Str = @Str +  ' AND (' + @Criteria + ') ORDER BY '+@Sort END END ELSE BEGIN IF @Criteria IS NOT NULL AND  RTRIM(LTRIM(@Criteria)) <> '' BEGIN SET @str = @str + ' AND (' + @Criteria + ') '  END END --对无记录时当前页数的处理 IF @TotalCount=0 BEGIN SET @Page = 0 END END EXEC sp_ExecuteSql @Str 由于本行业网站可以提高如下几类信息资源,现列表分示如下: ID 检索内容 数据表 检索命令示例 1 投资 CapitalInfoTab DECLARE @RC int DECLARE @TableViewQueryName varchar(1024) DECLARE @SearchKeyword nvarchar(100) DECLARE @SelectStr varchar(500) DECLARE @Criteria varchar(8000) DECLARE @Sort varchar(255) DECLARE @FristTopNum int DECLARE @Page bigint DECLARE @CurrentPageRow bigint DECLARE @TotalCount bigint DECLARE @Totaltimes bigint   -- TODO: 在此处设置参数值。 SET @SearchKeyword = '地产项目' SET @SelectStr = '*' SET @Sort = '' SET @Page= 1 SET @CurrentPageRow = 20 EXECUTE @RC = [InvestDM].[dbo].USP_CapitalInfo_FullIndex   @TableViewQueryName  ,@SearchKeyword  ,@SelectStr  ,@Criteria  ,@Sort  ,@FristTopNum  ,@Page   ,@CurrentPageRow  ,@TotalCount OUTPUT  ,@Totaltimes OUTPUT SELECT @Page,@TotalCount,@Totaltimes 2 融资 ProjectInfoTab DECLARE @SearchKeyword nvarchar(100) --传入的查询关键字 SET   @SearchKeyword = '深圳'   SELECT p.title, p.infoid, f.[rank] , keyword,title,provinceName,cityName,CountyName FROM FREETEXTTABLE([ProjectInfoFactTab], (provinceName,cityName,CountyName,keyword,title), @SearchKeyword) AS f INNER JOIN [ProjectInfoFactTab] AS p ON f.[key] = p.infoID ORDER BY RANK DESC 3 招商 MerchantInfoTab   DECLARE @SearchKeyword nvarchar(100) --传入的查询关键字   SET   @SearchKeyword = '深圳'   SELECT  ROW_NUMBER() OVER (ORDER BY RANK DESC) AS SerialNumber , F.[rank], p.* FROM FREETEXTTABLE( MerchantInfoFactTab , (ProvinceName, CityName,  CountyName, Keyword,   Title ,IndustryBName , shortcontent, ZoneAbout , ZoneAboutBrief, MerchantTypeName ,MerchantAttributeName,   CooperationDemandName ) ,   @SearchKeyword) AS f INNER JOIN  MerchantInfoFactTab  AS p  ON f.[key] = p.infoID 4 资讯 NewsTab    DECLARE @SearchKeyword nvarchar(100) --传入的查询关键字    SET   @SearchKeyword = '深圳'    SELECT   ROW_NUMBER() OVER (ORDER BY RANK DESC) AS SerialNumber , F.[rank] ,  p.*  FROM   FREETEXTTABLE( NewsInfoFactTab , (AreaName,  Keyword,   Title , DisplayTitle, subtitle ,Summary , Content ,NewsIndustryName ,  NewsTypeName ) , @SearchKeyword ) AS f INNER JOIN  NewsInfoFactTab  AS p   ON f.[key] = p.infoID 

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧