📄 unmanglenamedemomain.pas
字号:
unit UnmangleNameDemoMain;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
ExtCtrls, ComCtrls, StdCtrls, JclPeImage;
type
TForm1 = class(TForm)
ListView1: TListView;
OpenBtn: TButton;
OpenDialog1: TOpenDialog;
PeFileLabel: TLabel;
PackageLabel: TLabel;
FilenameLabel: TLabel;
PackageDescrLabel: TLabel;
PackageVerLabel: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure OpenBtnClick(Sender: TObject);
procedure ListView1Data(Sender: TObject; Item: TListItem);
private
BorImage: TJclPeBorImage;
public
procedure UpdateInfo;
class procedure LabelCaptionParam(Lbl: TLabel; const StringParam: string);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
uses
ComObj, TypInfo,
JclSysInfo, JclSysUtils, JclWin32;
// Demonstrates creating custom resource item classes
type
TJclPeResourceStringItem = class (TJclPeResourceItem)
public
function GetItemIDString(const ItemID: Word): string;
end;
TJclDemoPeBorImage = class (TJclPeBorImage)
protected
function ResourceItemCreate(AEntry: PImageResourceDirectoryEntry;
AParentItem: TJclPeResourceItem): TJclPeResourceItem; override;
public
function ResourceStringValue(const ID: Word): string;
end;
{ TJclPeResourceStringItem }
function TJclPeResourceStringItem.GetItemIDString(const ItemID: Word): string;
var
P: PWChar;
Cnt: Cardinal;
Len: Word;
begin
Result := '';
Assert(IsDirectory);
P := List[0].RawEntryData;
Cnt := 0;
while Cnt < 16 do
begin
Len := Word(P^);
if Len > 0 then
begin
Inc(P);
if Cnt = ItemID then
begin
Result := PChar(WideCharLenToString(P, Len));
Exit;
end;
Inc(P, Len);
end else
Inc(P);
Inc(Cnt);
end;
end;
{ TJclDemoPeBorImage }
function TJclDemoPeBorImage.ResourceItemCreate(AEntry: PImageResourceDirectoryEntry;
AParentItem: TJclPeResourceItem): TJclPeResourceItem;
begin
if (AParentItem <> nil) and (AParentItem.Level = 1) and (AParentItem.ResourceType = rtString) then
Result := TJclPeResourceStringItem.Create(Self, AParentItem, AEntry)
else
Result := inherited ResourceItemCreate(AEntry, AParentItem);
end;
function TJclDemoPeBorImage.ResourceStringValue(const ID: Word): string;
var
Item: TJclPeResourceItem;
BlockID, ItemID: Word;
begin
Result := '';
BlockID := (ID div 16) + 1;
ItemID := ID mod 16;
Item := ResourceList.FindResource(rtString, IntToStr(BlockID));
if Item <> nil then
Result := (Item as TJclPeResourceStringItem).GetItemIDString(ItemID);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
BorImage := TJclDemoPeBorImage.Create;
OpenDialog1.InitialDir := GetWindowsSystemFolder;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeAndNil(BorImage);
end;
procedure TForm1.OpenBtnClick(Sender: TObject);
begin
with OpenDialog1 do
begin
FileName := '';
if Execute then
begin
BorImage.FileName := FileName;
// BorImage.ExportList.SortList(esOrdinal);
UpdateInfo;
end;
end;
end;
procedure TForm1.UpdateInfo;
const
YesNoText: array [Boolean] of string = ('[NO]', '[YES]');
begin
ListView1.Items.Count := BorImage.ExportList.Count;
ListView1.Invalidate;
LabelCaptionParam(PeFileLabel, YesNoText[BorImage.IsBorlandImage]);
LabelCaptionParam(PackageLabel, YesNoText[BorImage.IsPackage]);
LabelCaptionParam(FilenameLabel, BorImage.FileName);
if BorImage.IsPackage then
begin
LabelCaptionParam(PackageDescrLabel, BorImage.PackageInfo.Description);
LabelCaptionParam(PackageVerLabel, IntToStr(BorImage.PackageCompilerVersion));
end
else
begin
LabelCaptionParam(PackageDescrLabel, '');
LabelCaptionParam(PackageVerLabel, '');
end;
end;
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
var
Unmangled, OriginalName, S, SectionName: string;
Descr: TJclBorUmDescription;
Res: TJclBorUmResult;
TI: PTypeInfo;
TD: PTypeData;
ResString: PResStringRec;
begin
with Item do
begin
OriginalName := BorImage.ExportList[Index].Name;
Res := PeBorUnmangleName(OriginalName, Unmangled, Descr);
if Res = urOk then
begin
Caption := Unmangled;
S := Copy(GetEnumName(TypeInfo(TJclBorUmSymbolKind), Integer(Descr.Kind)), 3, 255);
if smQualified in Descr.Modifiers then S := S + ' [Q]';
if smLinkProc in Descr.Modifiers then S := S + ' [L]';
SubItems.Add(S);
case Descr.Kind of
skRTTI:
begin
TI := BorImage.ExportList[Index].MappedAddress;
SubItems.Add(Copy(GetEnumName(TypeInfo(TTypeKind), Integer(TI^.Kind)), 3, 255));
SubItems.Add(TI^.Name);
TD := GetTypeData(TI);
case TI^.Kind of
tkInterface:
SubItems.Add(GUIDToString(TD^.Guid));
tkMethod:
SubItems.Add(GetEnumName(TypeInfo(TMethodKind), Integer(TD^.MethodKind)));
end;
end;
skData:
begin
SectionName := BorImage.ExportList[Index].SectionName;
SubItems.Add(SectionName);
if (smQualified in Descr.Modifiers) and (SectionName = 'CODE') then
begin // Exported data in CODE section are resourcestrings
ResString := BorImage.ExportList[Index].MappedAddress;
SubItems.Add(Format('ResString ID: %d', [ResString^.Identifier]));
SubItems.Add(TJclDemoPeBorImage(BorImage).ResourceStringValue(ResString^.Identifier));
end;
end;
end;
end else
begin // Not mangled or Microsoft compiler
PeUnmangleName(OriginalName, Unmangled);
Caption := Unmangled;
SubItems.Add(GetEnumName(TypeInfo(TJclBorUmResult), Integer(Res)));
end;
end;
end;
class procedure TForm1.LabelCaptionParam(Lbl: TLabel; const StringParam: string);
var
I: Integer;
begin
with Lbl do
begin
I := Pos(':', Caption);
if I = 0 then
Caption := Caption + ': ' + StringParam
else
Caption := Copy(Caption, 1, I) + ' ' + StringParam;
end;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -