📄 uresource.pas
字号:
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 + -