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

📄 frmmain.pas

📁 你用过ExeScope吗?它是能够将Exe文件中的资源进行查看并修改的工具
💻 PAS
📖 第 1 页 / 共 5 页
字号:
  tmpStr: String;
begin
  nbExeRes.ActivePage := 'TextPage';
  memText.Clear;
  tmpStream := TMemoryStream.Create;
  try
    tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
    tmpStream.Seek(0,0);
    CurPosition := 0;
    tmpStr := '';
    while CurPosition < ASize do
    begin
      tmpStream.Read(tmpByte,SizeOf(tmpByte));
      CurPosition := CurPosition + SizeOf(tmpByte);
      if tmpByte in [$0A,$0D] then
      begin
        if tmpByte=$0D then
        begin
          memText.Lines.Add(tmpStr);
          tmpStr := '';
        end
      end
      else if tmpByte in [0..31] then
        tmpStr := tmpStr + Format('$%.2x',[tmpByte])
      else
        tmpStr := tmpStr + Chr(tmpByte);
    end;
    //输出最后一行。
    if tmpStr<>'' then
       memText.Lines.Add(tmpStr);
  finally
    tmpStream.Free;
  end;
end;

{ 显示工具栏中按钮对应的ID }
procedure TMainForm.ShowToolItem(AOffset,ASize:Integer);
var
  tmpStream: TMemoryStream;
  toolbarID:  WORD;
  CurPosition: Integer;
begin
  nbExeRes.ActivePage := 'StringPage';
  lvStringRes.Clear;
  lvStringRes.Columns[0].Caption := '';
  lvStringRes.Columns[1].Caption := '';

  tmpStream := TMemoryStream.Create;
  try
    tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
    CurPosition := SizeOf(TToolItemInfo);
    tmpStream.Seek(CurPosition,0);
    while CurPosition < ASize do
    with lvStringRes.Items.Add do
    begin
      tmpStream.Read(toolbarID,SizeOf(toolbarID));
      CurPosition := CurPosition + SizeOf(toolbarID);
      Caption := Format('%6d',[toolbarID]);
    end;
  finally
    tmpStream.Free;
  end;
end;

{ 显示菜单 }
procedure TMainForm.ShowMenuItem(AOffset,ASize:Integer;MenuText:String);
var
  tmpStream: TMemoryStream;
  miOption,miID: WORD; //表示菜单的标志及ID,
  MenuChar: WChar;
  tmpMenuCaption: String;
  CurPosition,i: Integer;
  popNode:  TTreeNode;
  topmi,curmi: TMenuItem;
  IsTwoSkip,IsFirst: Boolean;
begin

  nbExeRes.ActivePage := 'MenuPage';
  trvMenuRes.Items.Clear;

{ 菜单资源数据的规则
  最前面两个字节(4 Bytes)不知道是什么含义.
  最后一个字节(2 Bytes)也不知道是什么含义.
  之后读取miOption,如果miOption是MF_POPUP,则miID自动为0而不会保存到这里来。
  直到某处的mtOption是$80,表示已经结束了这层POPUP.
  否则,miOption<>MF_POPUP,下一个WORD是miID,指示菜单的标识ID.
  //此办法在regedit.exe中失效.
}

  tmpStream := TMemoryStream.Create;
  try
    tmpStream := CurExeImg.GetSegStream(AOffset,ASize);
    tmpStream.Seek(4,0);
    CurPosition := 4;
    popNode := nil;
    //清除原来的菜单项
    for i:=MenuForm.mainmenu.Items.Count-1 downto 0 do
        MenuForm.mainmenu.Items.Delete(i);

    topmi := MenuForm.mainmenu.Items;
    IsTwoSkip := False;
    IsFirst := True;

    //本部分可处理了多层,通过popNode来控制
    while CurPosition < ASize-2  do
    begin
      //取miOption
      tmpStream.Read(miOption,SizeOf(miOption));
      CurPosition := CurPosition + SizeOf(miOption);

      if (miOption and MF_POPUP) =  MF_POPUP then
      begin
         miID := 0;
      end
      else begin
         tmpStream.Read(miID,SizeOf(miID));
         CurPosition := CurPosition + SizeOf(miID);
      end;
      tmpMenuCaption := '';
      //取菜单Caption,当然miOption属于MF_String,即第0位为0,否则处理错误
      //只能处理MF_String
      Repeat
        tmpStream.Read(MenuChar,SizeOf(MenuChar));
        CurPosition := CurPosition + SizeOf(MenuChar);
        if Ord(MenuChar) in [1..31] then
           tmpMenuCaption := tmpMenuCaption + Format('$%.2x',[Ord(MenuChar)])
        else
           tmpMenuCaption := tmpMenuCaption + MenuChar;
      until MenuChar=Chr(0);
      tmpMenuCaption := trim(tmpMenuCaption);
      if tmpMenuCaption = '' then tmpMenuCaption := '-';

      curmi := TMenuItem.Create(self);
      if pos('$09',tmpMenuCaption)>0 then
      begin
        curmi.Caption := Copy(tmpMenuCaption,0,Pos('$09',tmpMenuCaption)-1);
        ////还有ShortCut
      end
      else begin
        curmi.Caption := tmpMenuCaption;
      end;
      //将菜单标题显示到一个树状列表同时加到一个形象化的菜单上
      if (miOption and MF_POPUP)=MF_POPUP then
      begin
        popnode := trvMenuRes.Items.AddChild(popnode,Format('%d,%s',[miID,tmpMenuCaption]));
        topmi.Add(curmi);
        topmi := curmi;
        if ((miOption and MF_END)=MF_END)and(not IsFirst) then IsTwoSkip := True;
      end
      else if (miOption and MF_END)=MF_END then
      begin
        trvMenuRes.Items.AddChild(popnode,Format('%d,%s',[miID,tmpMenuCaption]));
        topmi.Add(curmi);
        if popnode<>nil then
        begin
          popnode := popnode.Parent;
          topmi := topmi.Parent;
        end;
        if (IsTwoSkip)and(popnode<>nil) then
        begin
          popnode := popnode.Parent;
          topmi := topmi.Parent;
          IsTwoSkip := False;
        end;
      end
      else begin
        trvMenuRes.Items.AddChild(popnode,Format('%d,%s',[miID,tmpMenuCaption]));
        topmi.Add(curmi);
      end;
      IsFirst := False;

    end;
    trvMenuRes.FullExpand;
    ////如何将trvMenuRes定位到第一个为显示的,否则超过界面有个滚动条跑到最后

  finally
    tmpStream.Free;
  end;

  MenuForm.Caption := Format('菜单 - %s',[MenuText]);
  btnShowCtrl.Visible := True;
  if BtnShowCtrl.Tag =1 then
  begin
    btnShowCtrl.Caption := '隐藏菜单(&M)';
    MenuForm.Show;
  end
  else begin
    btnShowCtrl.Caption := '显示菜单(&M)';
    MenuForm.Hide;
  end;
end;

{ 显示对话框 }
procedure TMainForm.ShowDialogBox(AOffset,ASize:Integer);
var
  tmpStream: TMemoryStream;
  //DlgHandle: THandle;
  DlgTemplate: TDlgTemplate;
  
  DlgItemTemplate: TDlgItemTemplate;
  tmpWord: WORD;
  i: Integer;
  tmpwChar: WChar;
  IsSkip: Boolean;
  tmpStr: String;
  tmpButton: TButton;
  tmpEdit:   TEdit;
  tmpStatic: TLabel;
  tmpListBox: TListBox;
  tmpComboBox: TComboBox;
  tmpScrollBox: TScrollBox;
  pt1: TPoint;
  cm: DWORD;
begin

  tmpStream := TMemoryStream.Create;
  try

    tmpStream := CurExeImg.GetSegStream(AOffset,ASize);

    //先遍历所有已存在的控件并删除
    for i := DialogForm.ControlCount-1 downto 0 do
       DialogForm.Controls[i].Free;

    tmpStream.Seek(0,0);
    //读取对话框
    tmpStream.Read(DlgTemplate,SizeOf(DlgTemplate));
    cm := GetDialogBaseUnits;

    //跳两个字
    tmpStream.Read(tmpWord,SizeOf(tmpWord));
    tmpStream.Read(tmpWord,SizeOf(tmpWord));
    //取标题
    tmpStr := '';
    repeat
      tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
      tmpStr := tmpStr + tmpWChar;
    until tmpWChar=Chr(0);
    tmpStr := trim(tmpStr);
    with DlgTemplate do
    begin
      pt1.X := LoWORD(cm)*cx div 4;
      pt1.Y := HiWORD(cm)*cy div 8;;
      //pt1 := ScreenToClient(pt1);
      DialogForm.Top :=LoWORD(cm)*x div 4;
      DialogForm.Left:=HiWORD(cm)*y div 8;
      DialogForm.ClientHeight := pt1.Y;
      DialogForm.ClientWidth  := pt1.X;
      DialogForm.Caption := tmpStr;
    end;

    //取字号
    tmpStream.Read(tmpWord,SizeOf(tmpWord));
    //取字体;
    tmpStr := '';
    repeat
      tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
      tmpStr := tmpStr + tmpWChar;
    until tmpWChar=Chr(0);
    tmpStr := trim(tmpStr);
    DialogForm.Font.Charset := DEFAULT_CHARSET;
    DialogForm.Font.Name := tmpStr;
    DialogForm.Font.Size := tmpWord;


    //读取每个控件的信息.
    for i:=0 to dlgTemplate.cdit-1 do
    begin
      tmpStream.Read(DlgItemTemplate,SizeOf(DlgItemTemplate));

      tmpStream.Read(tmpWord,SizeOf(tmpWord)); //跳过,一般为$FF
      tmpStream.Read(tmpWord,SizeOf(tmpWord)); //表示控件类型.
      //控件的描述
      tmpStream.Read(tmpWChar,SizeOf(tmpWChar));

      IsSkip := Ord(tmpWChar)=$FFFF;
      //if tmpWChar = Chr($FFFF) then IsSkip := True
      tmpStr := tmpWChar;
      repeat
        tmpStream.Read(tmpWChar,SizeOf(tmpWChar));
        tmpStr := tmpStr + tmpWChar;
      until tmpWChar=Chr(0);
      tmpStr := trim(tmpStr);
      if not IsSkip then
         tmpStream.Read(tmpWChar,SizeOf(tmpWChar))
      else
         tmpStr := '';
      Case tmpWord of
        $0080:
          begin
            tmpButton := TButton.Create(DialogForm);
            tmpButton.Parent := DialogForm;
            tmpButton.Left := LoWORD(cm)*DlgItemTemplate.x div 4;
            tmpButton.Top := HiWORD(cm)*DlgItemTemplate.y div 8;
            tmpButton.Width := LoWORD(cm)*DlgItemTemplate.cx div 4;
            tmpButton.Height :=HiWORD(cm)*DlgItemTemplate.cy div 8;
            tmpButton.Font.Charset := DialogForm.Font.Charset;
            tmpButton.Font.Name := DialogForm.Font.Name;
            tmpButton.Font.Size := DialogForm.Font.Size;
            tmpButton.Caption := tmpStr;
          end;
        $0081:
          begin
            tmpEdit := TEdit.Create(DialogForm);
            tmpEdit.Parent := DialogForm;
            tmpEdit.Left := LoWORD(cm)*DlgItemTemplate.x div 4;
            tmpEdit.Top :=  HiWORD(cm)*DlgItemTemplate.y div 8;
            tmpEdit.Width :=LoWORD(cm)*DlgItemTemplate.cx div 4;
            tmpEdit.Height :=HiWORD(cm)*DlgItemTemplate.cy div 8;
            tmpEdit.Text := tmpStr;

          end;
        $0082:
          begin
            tmpStatic := TLabel.Create(DialogForm);
            tmpStatic.Parent := DialogForm;
            tmpStatic.Left := LoWORD(cm)*DlgItemTemplate.x div 4;
            tmpStatic.Top :=  HiWORD(cm)*DlgItemTemplate.y div 8;
            tmpStatic.Width := LoWORD(cm)*DlgItemTemplate.cx div 4;
            tmpStatic.Height :=HiWORD(cm)*DlgItemTemplate.cy div 8;
            tmpStatic.Caption := tmpStr;

          end;
        $0083:
          begin
            tmpListBox := TListBox.Create(DialogForm);
            tmpListBox.Parent := DialogForm;
            tmpListBox.Left := DlgItemTemplate.x;
            tmpListBox.Top := DlgItemTemplate.y;
            tmpListBox.Width := DlgItemTemplate.cx;
            tmpListBox.Height := DlgItemTemplate.cy;
            //tmpListBox.Caption := tmpStr;

          end;

        $0084:
          begin
            tmpScrollBox := TScrollBox.Create(DialogForm);
            tmpScrollBox.Parent := DialogForm;
            tmpScrollBox.Left := DlgItemTemplate.x;
            tmpScrollBox.Top := DlgItemTemplate.y;
            tmpScrollBox.Width := DlgItemTemplate.cx;
            tmpScrollBox.Height := DlgItemTemplate.cy;

          end;
        $0085:
          begin
            tmpComboBox := TComboBox.Create(DialogForm);
            tmpComboBox.Parent := DialogForm;
            tmpComboBox.Left := DlgItemTemplate.x;
            tmpComboBox.Top := DlgItemTemplate.y;
            tmpComboBox.Width := DlgItemTemplate.cx;
            tmpComboBox.Height := DlgItemTemplate.cy;

          end;
      end;
    end;

    {
    DlgStream.Seek(0,0);
    //读取对话框
    DlgStream.Read(DlgTemplate,SizeOf(DlgTemplate));

    DlgHandle := CreateDialogIndirect(Application.Handle,DlgTemplate,MainForm.Handle,0);
    if DlgHandle<>0  then
       ShowWindow(DlgHandle,SW_SHOW);
    }
  finally
    tmpStream.Free;
  end;

  btnShowCtrl.Caption := '显示对话(&D)';
  btnShowCtrl.Tag := 2; //隐藏了对话
  btnShowCtrl.Visible := True;

end;

{ 显示位图 }
procedure TMainForm.ShowBitmap(AOffset,ASize:Integer);
var
  tmpStream: TMemoryStream;
  tmpFileName:String;
  //tmpBitmap: TBitmap;
begin
  nbExeRes.ActivePage:='ImagePage';

  tmpFileName := 'c:\tmp.bmp'; //ExtractFilePath(Application.ExeName)+'tmp.bmp';
  tmpStream := TMemoryStream.Create;
  try
    tmpStream := CurExeImg.GetBitmapStream(AOffset,ASize);
    tmpStream.SaveToFile(tmpFileName);
  finally
    tmpStream.Free;
  end;
  
  // 显示位图并调整位置到居中
  with ImgPICRes do
  begin
    Visible:=False;
    try
       Picture.LoadFromFile(tmpFileName);
       deleteFile(tmpFileName);
    except
       ShowMessage(tmpFileName+' 未找到!');
    end;
    ScrollBoxImgResize(nil);
    Visible:=True;
  end;
end;

{ 显示光标 }
procedure TMainForm.ShowCursor(AOffset,ASize,HeaderOffset,NameID:Integer);
var
  tmpStream: TMemoryStream;
  tmpFileName: String;
  bWidth,bHeight:Byte;
begin

{--如果显示位图的能行,则ICON也可以吧
var
  tmpICON: TICON;
}

  nbExeRes.ActivePage:='ImagePage';
  tmpFileName := Format('c:\%d.ico',[NameID]); // ExtractFilePath(Application.ExeName)+InttoStr(NameID)+'.ico';
  tmpStream := TMemoryStream.Create;
  try
    tmpStream := CurExeImg.GetCursorStream(AOffset,ASize,HeaderOffset,NameID);
    tmpStream.Seek(6,0);
    tmpStream.Read(bWidth,SizeOf(bWidth));
    tmpStream.Read(bHeight,SizeOf(bHeight));
    tmpStream.SaveToFile(tmpFileName);
    // 显示光标并调整位置到居中
    with ImgPICRes do
    begin
      Visible:=False;

⌨️ 快捷键说明

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