⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pesearch.pas

📁 Jedi Code Library JCL JVCL 组件包 JCL+JVCL超过300个组件的非可视/可视大型组件包。
💻 PAS
字号:
unit PeSearch;

{$I JCL.INC}

{$IFDEF COMPILER6_UP}
  {$WARN UNIT_PLATFORM OFF}
{$ENDIF COMPILER6_UP}

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls, JclPeImage, ExtCtrls;

type
  TPeSearchChild = class(TForm)
    FuncNameEdit: TEdit;
    ResultListView: TListView;
    StartBtn: TButton;
    ProcessLabel: TLabel;
    StopBtn: TButton;
    Bevel1: TBevel;
    PathEdit: TEdit;
    CountLabel: TLabel;
    SelectDirBtn: TButton;
    Label1: TLabel;
    Label2: TLabel;
    ExportCheckBox: TCheckBox;
    ImportCheckBox: TCheckBox;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure StartBtnClick(Sender: TObject);
    procedure StopBtnClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure SelectDirBtnClick(Sender: TObject);
    procedure FuncNameEditChange(Sender: TObject);
    procedure ResultListViewDblClick(Sender: TObject);
  private
    FSearchThread: TJclPeNameSearch;
    procedure SearchDone(Sender: TObject);
    procedure SearchFound(Sender: TObject; const FileName: TFileName;
      const FunctionName: string; Option: TJclPeNameSearchOption);
    procedure SearchProcessFile(Sender: TObject; PeImage: TJclPeImage; var Process: Boolean);
    procedure UpdateCounter;
    procedure UpdateButtons;
  public
    function ActiveLibName: string;
    procedure ClearResults;
    procedure StartSearch;
    procedure StopSearch;
  end;

var
  PeSearchChild: TPeSearchChild;

implementation

{$R *.DFM}

uses
  FileCtrl, JclSysInfo, PeViewerMain;

procedure TPeSearchChild.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if Assigned(FSearchThread) then
  begin
    FSearchThread.OnFound := nil;
    FSearchThread.OnProcessFile := nil;
    FSearchThread.OnTerminate := nil;
    FSearchThread.Terminate;
  end;
  Action := caFree;
end;

procedure TPeSearchChild.SearchDone(Sender: TObject);
begin
  FSearchThread := nil;
  UpdateButtons;
  ProcessLabel.Caption := '';
end;

procedure TPeSearchChild.SearchFound(Sender: TObject; const FileName: TFileName;
  const FunctionName: string; Option: TJclPeNameSearchOption);
begin
  with ResultListView.Items.Add do
  begin
    Caption := FunctionName;
    SubItems.Add(FileName);
    case Option of
      seImports: ImageIndex := icoImports;
      seDelayImports: ImageIndex := icoDelayImport;
      seBoundImports: ImageIndex := icoBoundImport;
      seExports: ImageIndex := icoExports;
    end;
  end;
  UpdateCounter;
end;

procedure TPeSearchChild.SearchProcessFile(Sender: TObject; PeImage: TJclPeImage; var Process: Boolean);
begin
  ProcessLabel.Caption := PeImage.FileName;
end;

procedure TPeSearchChild.StartSearch;
var
  Options: TJclPeNameSearchOptions;
begin
  Options := [];
  if ExportCheckBox.Checked then Include(Options, seExports);
  if ImportCheckBox.Checked then Options := Options + [seImports, seDelayImports, seBoundImports];
  FSearchThread := TJclPeNameSearch.Create(Trim(FuncNameEdit.Text),
    PathEdit.Text, Options);
  FSearchThread.OnTerminate := SearchDone;
  FSearchThread.OnFound := SearchFound;
  FSearchThread.OnProcessFile := SearchProcessFile;
  UpdateButtons;
  ClearResults;
  FSearchThread.Resume;
end;

procedure TPeSearchChild.StopSearch;
begin
  FSearchThread.Terminate;
end;

procedure TPeSearchChild.StartBtnClick(Sender: TObject);
begin
  StartSearch;
end;

procedure TPeSearchChild.StopBtnClick(Sender: TObject);
begin
  StopSearch;
end;

procedure TPeSearchChild.FormCreate(Sender: TObject);
begin
  ProcessLabel.Caption := '';
  PathEdit.Text := GetWindowsSystemFolder;
  UpdateButtons;
  UpdateCounter;
end;

procedure TPeSearchChild.SelectDirBtnClick(Sender: TObject);
var
  S: string;
begin
  if SelectDirectory('', '', S) then PathEdit.Text := S;
end;

procedure TPeSearchChild.ClearResults;
begin
  with ResultListView.Items do
  begin
    BeginUpdate;
    Clear;
    EndUpdate;
  end;
  UpdateCounter;
end;

procedure TPeSearchChild.UpdateCounter;
begin
  with ResultListView.Items do
    if Count = 0 then
      CountLabel.Caption := ''
    else
      CountLabel.Caption := Format('%d', [Count]);
end;

procedure TPeSearchChild.UpdateButtons;
begin
  StartBtn.Enabled := (FuncNameEdit.Text <> '') and (PathEdit.Text <> '') and
    (ImportCheckBox.Checked or ExportCheckBox.Checked) and
    not Assigned(FSearchThread);
  StopBtn.Enabled := Assigned(FSearchThread);
  FuncNameEdit.Enabled := not Assigned(FSearchThread);
  PathEdit.Enabled := not Assigned(FSearchThread);
  SelectDirBtn.Enabled := not Assigned(FSearchThread);
  ExportCheckBox.Enabled := not Assigned(FSearchThread);
  ImportCheckBox.Enabled := not Assigned(FSearchThread);
end;

procedure TPeSearchChild.FuncNameEditChange(Sender: TObject);
begin
  UpdateButtons;
end;

function TPeSearchChild.ActiveLibName: string;
begin
  if ResultListView.Selected <> nil then
    Result := ResultListView.Selected.SubItems[0]
  else
    Result := '';
end;

procedure TPeSearchChild.ResultListViewDblClick(Sender: TObject);
begin
  MainForm.OpenLibrary1.Execute;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -