196 lines
5.2 KiB
ObjectPascal
196 lines
5.2 KiB
ObjectPascal
unit ClrDemoMain;
|
|
|
|
interface
|
|
|
|
uses
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
|
ActnList, Menus, ComCtrls, ClrDemoAbstractFrame,
|
|
JclPeImage, JclCLR, ClrDemoMetaDataFrame, ClrDemoCLRFrame;
|
|
|
|
type
|
|
TfrmMain = class(TForm)
|
|
lstActions: TActionList;
|
|
actFileExit: TAction;
|
|
actFileOpen: TAction;
|
|
actHelpAbout: TAction;
|
|
mnuMain: TMainMenu;
|
|
mnuFile: TMenuItem;
|
|
mnuFileOpen: TMenuItem;
|
|
mnuFileLine0: TMenuItem;
|
|
mnuFileExit: TMenuItem;
|
|
mnuHelp: TMenuItem;
|
|
mnuFileAbout: TMenuItem;
|
|
dlgOpen: TOpenDialog;
|
|
barStatus: TStatusBar;
|
|
PC: TPageControl;
|
|
tsMetadata: TTabSheet;
|
|
frmMetadata: TfrmMetadata;
|
|
popMetadataStream: TPopupMenu;
|
|
actViewStreamData: TAction;
|
|
popViewStreamData: TMenuItem;
|
|
mnuView: TMenuItem;
|
|
mnuViewStreamData: TMenuItem;
|
|
tsCLR: TTabSheet;
|
|
frmCLR: TfrmCLR;
|
|
actFileDump: TAction;
|
|
dlgSave: TSaveDialog;
|
|
mnuFileDump: TMenuItem;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormDestroy(Sender: TObject);
|
|
procedure actFileExitExecute(Sender: TObject);
|
|
procedure actHelpAboutExecute(Sender: TObject);
|
|
procedure actFileOpenExecute(Sender: TObject);
|
|
procedure PCChange(Sender: TObject);
|
|
procedure actViewStreamDataUpdate(Sender: TObject);
|
|
procedure actViewStreamDataExecute(Sender: TObject);
|
|
procedure frmMetadatalstStreamDblClick(Sender: TObject);
|
|
procedure actFileDumpExecute(Sender: TObject);
|
|
procedure actFileDumpUpdate(Sender: TObject);
|
|
private
|
|
m_Image: TJclPeImage;
|
|
m_CLR: TJclCLRHeaderEx;
|
|
|
|
function GetActiveFrame: TfrmAbstract;
|
|
public
|
|
{ Public declarations }
|
|
end;
|
|
|
|
var
|
|
frmMain: TfrmMain;
|
|
|
|
implementation
|
|
|
|
{$R *.DFM}
|
|
|
|
uses
|
|
ShellApi, ClrDemoStringsForm, ClrDemoGuidForm, ClrDemoBlobForm,
|
|
ClrDemoTableForm, ClrDemoUserStringsForm;
|
|
|
|
const
|
|
CRLF = #10#13;
|
|
|
|
procedure TfrmMain.FormCreate(Sender: TObject);
|
|
begin
|
|
m_Image := nil;
|
|
m_CLR := nil;
|
|
end;
|
|
|
|
procedure TfrmMain.FormDestroy(Sender: TObject);
|
|
begin
|
|
FreeAndNil(m_CLR);
|
|
FreeAndNil(m_Image);
|
|
end;
|
|
|
|
function TfrmMain.GetActiveFrame: TfrmAbstract;
|
|
var
|
|
I: Integer;
|
|
begin
|
|
if Assigned(PC.ActivePage) then
|
|
with PC.ActivePage do
|
|
for I:=0 to ControlCount-1 do
|
|
if Controls[0].InheritsFrom(TfrmAbstract) then
|
|
begin
|
|
Result := TfrmAbstract(Controls[0]);
|
|
Exit;
|
|
end;
|
|
|
|
raise Exception.Create('No frame was active!');
|
|
end;
|
|
|
|
procedure TfrmMain.actFileExitExecute(Sender: TObject);
|
|
begin
|
|
Close;
|
|
end;
|
|
|
|
procedure TfrmMain.actHelpAboutExecute(Sender: TObject);
|
|
begin
|
|
ShellAbout(Handle, PChar(Caption),
|
|
PChar('JEDI Code Library (JCL)' + CRLF + 'http://delphi-jedi.org/'),
|
|
Application.Icon.Handle);
|
|
end;
|
|
|
|
procedure TfrmMain.actFileOpenExecute(Sender: TObject);
|
|
var
|
|
Img: TJclPeImage;
|
|
begin
|
|
if dlgOpen.Execute then
|
|
begin
|
|
Img := TJclPeImage.Create;
|
|
Img.FileName := dlgOpen.FileName;
|
|
|
|
if Img.IsCLR then
|
|
begin
|
|
FreeAndNil(m_Image);
|
|
m_Image := Img;
|
|
|
|
FreeAndNil(m_CLR);
|
|
m_CLR := TJclCLRHeaderEx.Create(m_Image);
|
|
GetActiveFrame.ShowInfo(m_CLR);
|
|
end
|
|
else
|
|
begin
|
|
FreeAndNil(Img);
|
|
MessageDlg(Format('The file %s is not a CLR file', [dlgOpen.FileName]), mtWarning, [mbOK], 0);
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmMain.PCChange(Sender: TObject);
|
|
begin
|
|
if Assigned(m_CLR) then
|
|
GetActiveFrame.ShowInfo(m_CLR);
|
|
end;
|
|
|
|
procedure TfrmMain.actViewStreamDataUpdate(Sender: TObject);
|
|
begin
|
|
with frmMetadata.lstStream do
|
|
TAction(Sender).Enabled := Assigned(Selected) and
|
|
((TObject(Selected.Data).ClassType = TJclCLRStringsStream) or
|
|
(TObject(Selected.Data).ClassType = TJclCLRGuidStream) or
|
|
(TObject(Selected.Data).ClassType = TJclCLRUserStringStream) or
|
|
(TObject(Selected.Data).ClassType = TJclCLRBlobStream) or
|
|
(TObject(Selected.Data).ClassType = TJclCLRTableStream));
|
|
end;
|
|
|
|
procedure TfrmMain.actViewStreamDataExecute(Sender: TObject);
|
|
begin
|
|
with frmMetadata.lstStream do
|
|
if TObject(Selected.Data).ClassType = TJclCLRStringsStream then
|
|
TfrmStrings.Execute(Selected.Data)
|
|
else if TObject(Selected.Data).ClassType = TJclCLRGuidStream then
|
|
TfrmGuid.Execute(Selected.Data)
|
|
else if TObject(Selected.Data).ClassType = TJclCLRUserStringStream then
|
|
TfrmUserStrings.Execute(Selected.Data)
|
|
else if TObject(Selected.Data).ClassType = TJclCLRBlobStream then
|
|
TfrmBlobs.Execute(Selected.Data)
|
|
else if TObject(Selected.Data).ClassType = TJclCLRTableStream then
|
|
TfrmTable.Execute(Selected.Data);
|
|
end;
|
|
|
|
procedure TfrmMain.frmMetadatalstStreamDblClick(Sender: TObject);
|
|
begin
|
|
if actViewStreamData.Enabled then
|
|
actViewStreamDataExecute(Sender);
|
|
end;
|
|
|
|
procedure TfrmMain.actFileDumpExecute(Sender: TObject);
|
|
begin
|
|
dlgSave.InitialDir := ExtractFilePath(m_Image.FileName);
|
|
dlgSave.FileName := ExtractFileName(ChangeFileExt(m_Image.FileName, '.il'));
|
|
if dlgSave.Execute then
|
|
with TStringList.Create do
|
|
try
|
|
Text := m_CLR.DumpIL;
|
|
SaveToFile(dlgSave.FileName);
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TfrmMain.actFileDumpUpdate(Sender: TObject);
|
|
begin
|
|
TAction(Sender).Enabled := Assigned(m_CLR);
|
|
end;
|
|
|
|
end.
|