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

📄 uresource.pas

📁 在delphi中实现windows核心编程.原书光盘代码核心编程.原书光盘代码
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    begin
      ResourceDirectoryEntry := PImageResourceDirectoryEntry(Selected.Data);
      ResType:=TreeView.Selected.ImageIndex;
      if Selected.HasChildren then // ResourceIsDirectory(ResourceDirectoryEntry) then
      begin
         {如果是资源目录}
         UpdateListView(Selected); {显示资源目录包含的资源列表}
         ListViewCaption.Caption := ' ' + TreeView.Selected.Text;
         StatusBar.Panels[0].Text := Format(' %d 个对象', [ListView.Items.Count]);
         StatusBar.Panels[1].Text := Format(' 偏移: %x', [ResourceOffset(Selected.Data)]);
      end
      else
      begin
         case ResType of
          rtBitmap, rtIconEntry, rtCursorEntry:
            begin
              MemStream := TMemoryStream.Create;
              try
                 ResourceSaveToStream(ResType,ResourceDirectoryEntry,MemStream);
                 MemStream.Seek(0, 0);
                 case ResType of
                 rtBitmap: ImageViewer.Picture.Bitmap.LoadFromStream(MemStream);
                 rtIconEntry: ImageViewer.Picture.Icon.LoadFromStream(MemStream);
                 rtCursorEntry:
                    begin
                       MemStream.SaveToFile(extractfilepath(paramstr(0))+'bak.cur');
                       ImageViewer.Picture.Icon.Handle:=LoadCursorFromFile(pchar(extractfilepath(paramstr(0))+'bak.cur'));
                    end;
                 end;
              finally
                 MemStream.Free;
              end;
              Notebook.PageIndex := 1;
            end;
          rtString, rtMenu:
            begin
              MemStream := TMemoryStream.Create;
              try
                 ResourceSaveToStream(ResType,ResourceDirectoryEntry,MemStream);
                 setlength(S,MemStream.Size);
                 Move(MemStream.Memory^,S[1],MemStream.Size);
                 StringViewer.Lines.Text := S;
              finally
                 MemStream.Free;
              end;
              StringViewer.SelStart := 0;
              Notebook.PageIndex := 2;
            end
        else
          begin
            HexDump.Address := ResourceRawData(ResourceDirectoryEntry);
            HexDump.DataSize := ResourceSize(ResourceDirectoryEntry);
            Notebook.PageIndex := 3;
          end;
        end;
        ListViewCaption.Caption := Format(' %s: %s', [ResourceTypeName[ResType], Selected.text]);
        StatusBar.Panels[0].Text := '';
        StatusBar.Panels[1].Text := Format(' 偏移: %x  Size: %x', [ResourceOffset(Selected.Data), ResourceSize(Selected.Data)]);
      end;
    end;
  end;
end;

procedure TfrmResource.UpdateListView(TreeNode: TTreeNode);
var
  I: Integer;
  N:TListItem;
//  ResType:TResourceType;
begin
  ListView.Items.Clear;
  for I := 0 to TreeNode.Count - 1 do
  begin
    N:=ListView.Items.Add;
    N.Data := TreeNode.Item[I].Data;
    N.Caption := TreeNode.Item[I].Text;
//    ResType := TreeNode.Item[I].ImageIndex;
    N.SubItems.Add(Format('%.7x', [ResourceOffset(TreeNode.Item[I].Data)]));
    N.SubItems.Add(Format('%.5x', [ResourceSize(TreeNode.Item[I].Data)]));   
    N.ImageIndex := TreeNode.Item[I].ImageIndex;
  end;
  Notebook.PageIndex := 0;
end;

procedure TfrmResource.FormCreate(Sender: TObject);
begin
  SplitControl := TSplitControl.Create(Self);
  HexDump := CreateHexDump(TWinControl(NoteBook.Pages.Objects[3]));
  Notebook.PageIndex := 0;
end;


procedure TfrmResource.FileExit(Sender: TObject);
begin
  Close;
end;

procedure TfrmResource.ListViewEnter(Sender: TObject);
begin
  with ListView do
    if (Items.Count > 1) and (Selected = nil) then
    begin
      Selected := Items[0];
      ItemFocused := Selected;
    end;
end;

procedure TfrmResource.SaveResource(Sender: TObject);
var
  ResourceDirectoryEntry:PImageResourceDirectoryEntry;
  ResType:TResourceType;
  function TreeViewResourceSelected: Boolean;
  begin
    Result := Assigned(TreeView.Selected) and
      Assigned(TreeView.Selected.Data) and
      not TreeView.Selected.HasChildren;
    if Result then
    begin
       ResType:=TreeView.Selected.ImageIndex;
       ResourceDirectoryEntry := PImageResourceDirectoryEntry(TreeView.Selected.Data);
    end;
  end;

  function ListViewResourceSelected: Boolean;
  begin
    Result := Assigned(ListView.Selected) and
      Assigned(ListView.Selected.Data);
//      not ListView.Selected.HasChildren;
    if Result then
    begin
       ResType:=ListView.Selected.ImageIndex;
       ResourceDirectoryEntry := PImageResourceDirectoryEntry(ListView.Selected.Data);
    end;
  end;

begin
  if (TreeViewResourceSelected or ListViewResourceSelected) then
  {如果已选中一个资源项}
    with FileSaveDialog do
    begin
      FilterIndex := ResFiltMap[ResType];
      DefaultExt := ImageExt[ResType];
//      showmessage(inttostr(filterindex));
      if Execute then
      begin
//        if ExtractFileExt(FileName)='' then
//          FileName:=FileName+ImageExt[ResType];
        ResourceSaveToFile(ResType,ResourceDirectoryEntry,FileName); {保存文件}
      end;
    end;
end;

procedure TfrmResource.SelectListViewType(Sender: TObject);
begin
  ListView.ViewStyle := TViewStyle(TComponent(Sender).Tag);
  {利用Tag区分选择不同的菜单项}
end;

procedure TfrmResource.ToggleStatusBar(Sender: TObject);
begin
  StatusBar.Visible := not StatusBar.Visible;
end;

procedure TfrmResource.TreeViewChange(Sender: TObject; Node: TTreeNode);
begin
  {更新面板}
  UpdateViewPanel;
end;

procedure TfrmResource.ViewMenuDropDown(Sender: TObject);
var
  I: Integer;
begin
  miViewStatusBar.Checked := StatusBar.Visible;
  for I := 0 to miView.Count - 1 do
    with miView.Items[I] do
      if GroupIndex = 1 then
        Checked := (Tag = Ord(ListView.ViewStyle));
end;

procedure TfrmResource.SplitterMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if (Button = mbLeft) and (Shift = [ssLeft]) then
    SplitControl.BeginSizing(Splitter, TreeViewPanel);
end;

procedure TfrmResource.SplitterMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  with SplitControl do if Sizing then ChangeSizing(X, Y);
end;

procedure TfrmResource.SplitterMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  with SplitControl do if Sizing then EndSizing;
end;

procedure TfrmResource.NotebookEnter(Sender: TObject);
var
  Page: TWinControl;
begin
  with NoteBook do
  begin
    Page := TWinControl(Pages.Objects[PageIndex]);
    if (Page.ControlCount > 0) and (Page.Controls[0] is TWinControl) then
      TWinControl(Page.Controls[0]).SetFocus;
  end;
end;

procedure TfrmResource.FormDestroy(Sender: TObject);
begin
  SplitControl.Free;
end;

procedure TfrmResource.FormShow(Sender: TObject);
begin
  ListView.Items.Clear;  //右边显示框
  TreeView.Selected := nil;
  TreeView.Items.Clear;  //左边显示框,用于选择第几级资源
  {显示PE文件的资源信息,资源信息是一个树状结构}
  ResourceBase:=LoadPE_GotoResources(frmMain.FileName,Base,ResourceRVA);
  LoadResources(ResourceBase, nil, rtFirstEntry); {Resources会自动初始化,并读取PE文件的所有资源}
  ExtractIconCursorLink;
  Caption := Format('%s - %s', ['资源搜索', AnsiLowerCaseFileName(frmMain.FileName)]);
  with TreeView do
  begin
    SetFocus;
    {选中第一项}
    Selected := Items[0];
  end;
end;

procedure TfrmResource.FormClose(Sender: TObject;
  var Action: TCloseAction);
begin
   FreePE;
end;

end.

⌨️ 快捷键说明

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