Текущий архив: 2006.10.08;
Скачать: CL | DM;
ВнизРесурсные строки Найти похожие ветки
← →
Plotnick (2006-05-28 19:12) [0]Привет, мастера.
Мне необходимо узнать (перечислить, перебрать) все ресурсные строки, а также имена форм и фреймов хранящихся в экзешнике моего приложения. Как это сделать? Примерчиком никто не кинется?
← →
begin...end © (2006-05-28 19:17) [1]EnumResourceNames
← →
Plotnick (2006-05-28 23:02) [2]Спасибо, этого достаточно.
← →
Чапаев © (2006-05-29 13:47) [3]
> Спасибо, этого достаточно.
Пример рабочего кода кинуть можешь? Когда-то над такой же задачей мучился-мучился, так и не добился положительного результата, хотя вроде бы всё просто...
← →
Игорь Шевченко © (2006-05-29 13:52) [4]unit main;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Menus, StdCtrls;
type
TCursorOrIcon = packed record
Reserved : WORD;
ResType : WORD;
Count : WORD;
end;
PCursorOrIcon = ^TCursorOrIcon;
TIconFileHeader = packed record
DirectoryHeader : TCursorOrIcon;
Width : Byte;
Height : Byte;
Colors : Word;
Reserved1 : Word;
Reserved2 : Word;
DIBSize : DWORD;
DIBOffset : DWORD;
end;
PIconFileHeader = ^TIconFileHeader;
TfMain = class(TForm)
OpenDialog: TOpenDialog;
MainMenu: TMainMenu;
File1: TMenuItem;
Open1: TMenuItem;
N1: TMenuItem;
Exit1: TMenuItem;
ListBox: TListBox;
btnExtract: TButton;
procedure Exit1Click(Sender: TObject);
procedure Open1Click(Sender: TObject);
procedure btnExtractClick(Sender: TObject);
private
FFileName : string;
procedure EnumRCData;
procedure EnumIcons;
procedure ExtractResource (const ExeName : string; ResName : PChar;
AResType : Integer);
procedure ExtractIconResource (const ExeName : string;
IconDirectoryInfo : PCursorOrIcon);
procedure ExtractIcon (const ExeName : string; IconID : PChar;
IconFileHeader : TIconFileHeader);
end;
var
fMain: TfMain;
implementation
{$R *.DFM}
function IsAtom(const P : PChar) : Boolean;
begin
Result := HIWORD(Cardinal(P)) = 0;
end;
function EnumResNames (HMod : HMODULE; const ResType, ResName : PChar;
Param : LPARAM) : LongBool; stdcall;
begin
with TfMain(Param) do
ListBox.Items.AddObject(ResName, TObject(ResType));
Result := true;
end;
procedure TfMain.EnumRCData;
var
HMod : HMODULE;
begin
ListBox.Items.Clear;
HMod := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);
if HMod <> 0 then
try
EnumResourceNames(HMod, RT_RCDATA, @EnumResNames, LPARAM(Self));
finally
FreeLibrary(HMod);
end;
btnExtract.Enabled := ListBox.Items.Count <> 0;
if ListBox.Items.Count <> 0 then begin
ListBox.ItemIndex := 0;
ListBox.SetFocus;
end;
end;
procedure TfMain.Exit1Click(Sender: TObject);
begin
Close;
end;
procedure TfMain.ExtractResource(const ExeName : string; ResName: PChar;
AResType : Integer);
var
HMod : HMODULE;
HFindRes : HRSRC;
HRes : HGLOBAL;
ResSize : Cardinal;
ResData : Pointer;
FileH : Integer;
FileName : string;
begin
HMod := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);
if HMod <> 0 then
try
HFindRes := FindResource(HMod, ResName, MakeIntResource(AResType));
if HFindRes <> 0 then begin
ResSize := SizeOfResource(HMod, HFindRes);
HRes := LoadResource(HMod, HFindRes);
if HRes <> 0 then begin
ResData := LockResource(HRes);
if MakeIntResource(AResType) = RT_GROUP_ICON then
ExtractIconResource (ExeName, PCursorOrIcon(ResData))
else begin
if HIWORD(Cardinal(ResName)) = 0 then
FileName := Format("#%d", [Integer(ResName)])
else
FileName := ResName;
FileH := FileCreate (ChangeFileExt(FileName, ".DAT"));
if FileH <> -1 then begin
FileWrite (FileH, ResData^, ResSize);
FileClose (FileH);
end;
end;
end;
end;
finally
FreeLibrary(HMod);
end;
end;
procedure TfMain.Open1Click(Sender: TObject);
begin
if OpenDialog.Execute then begin
FFileName := OpenDialog.FileName;
EnumRCData;
EnumIcons;
end;
end;
procedure TfMain.btnExtractClick(Sender: TObject);
begin
ExtractResource(FFileName, PChar(ListBox.Items[ListBox.ItemIndex]),
Integer(ListBox.Items.Objects[ListBox.ItemIndex]));
end;
procedure TfMain.EnumIcons;
var
HMod : HMODULE;
begin
HMod := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);
if HMod <> 0 then
try
EnumResourceNames(HMod, RT_GROUP_ICON, @EnumResNames, LPARAM(Self));
finally
FreeLibrary(HMod);
end;
btnExtract.Enabled := ListBox.Items.Count <> 0;
if ListBox.Items.Count <> 0 then begin
ListBox.ItemIndex := 0;
ListBox.SetFocus;
end;
end;
type
TIconResData = packed record
Width : Byte;
Height : Byte;
Colors : Word;
Reserved1 : Word;
Reserved2 : Word;
DIBSize : DWORD;
DIBOffset : Word;
end;
TIconResDataArray = packed array[1..255] of TIconResData;
TIconDirectory = packed record
Header : TCursorOrIcon;
Icons : TIconResDataArray;
end;
PIconDirectory = ^TIconDirectory;
procedure TfMain.ExtractIconResource(const ExeName : string;
IconDirectoryInfo: PCursorOrIcon);
var
I : Integer;
Directory : PIconDirectory;
IconFileHeader : TIconFileHeader;
begin
if IconDirectoryInfo^.Count > 0 then begin
Directory := PIconDirectory(IconDirectoryInfo);
for I:=1 to IconDirectoryInfo^.Count do begin
FillChar(IconFileHeader, SizeOf(IconFileHeader), 0);
IconFileHeader.DirectoryHeader.ResType := IconDirectoryInfo^.ResType;
IconFileHeader.DirectoryHeader.Count := 1;
IconFileHeader.Width := Directory^.Icons[I].Width;
IconFileHeader.Height := Directory^.Icons[I].Height;
IconFileHeader.Colors := Directory^.Icons[I].Colors;
IconFileHeader.Reserved1 := Directory^.Icons[I].Reserved1;
IconFileHeader.Reserved2 := Directory^.Icons[I].Reserved2;
IconFileHeader.DIBSize := Directory^.Icons[I].DIBSize;
IconFileHeader.DIBOffset := SizeOf(IconFileHeader);
ExtractIcon(ExeName, MakeIntResource(Directory^.Icons[I].DIBOffset),
IconFileHeader);
end;
end;
end;
procedure TfMain.ExtractIcon(const ExeName: string; IconID: PChar;
IconFileHeader: TIconFileHeader);
var
HMod : HMODULE;
HFindRes : HRSRC;
HRes : HGLOBAL;
ResSize : Cardinal;
ResData : Pointer;
FileH : Integer;
FileName : string;
begin
HMod := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);
if HMod <> 0 then
try
HFindRes := FindResource(HMod, IconID, RT_ICON);
if HFindRes <> 0 then begin
ResSize := SizeOfResource(HMod, HFindRes);
HRes := LoadResource(HMod, HFindRes);
if HRes <> 0 then begin
ResData := LockResource(HRes);
if IsAtom(IconID) then
FileName := Format("#%d", [Integer(IconID)])
else
FileName := IconID;
FileH := FileCreate (ChangeFileExt(FileName, ".ICO"));
if FileH <> -1 then begin
FileWrite (FileH, IconFileHeader, SizeOf(IconFileHeader));
FileWrite (FileH, ResData^, ResSize);
FileClose (FileH);
end;
end;
end;
finally
FreeLibrary(HMod);
end;
end;
end.
Кроме всего прочего иконки вынимает :)
← →
Чапаев © (2006-05-29 14:07) [5]Да с иконками-то да RC_DATA всё отлично. А вот именно со строковыми ресурсами поджидала меня розовая птица Обломинго.
Беглым взглядом не углядел, где в приведенном тексте строковые ресурсы упоминаются. Если таки упоминаются -- просю пардону.
← →
Eraser © (2006-05-29 14:10) [6]так вроде в примерах, которые с Делфи идут, есть такая программа
C:\Program Files\Borland\BDS\4.0\Demos\DelphiWin32\VCLWin32\resXplor
название говорит само за себя, и строки там тоже перечисляются.
← →
Чапаев © (2006-05-29 14:19) [7]Гм... Действительно.
← →
Игорь Шевченко © (2006-05-29 14:34) [8]
> название говорит само за себя, и строки там тоже перечисляются.
Все бы хорошо, но пример из Demos практически не работает именно со строками.
← →
Игорь Шевченко © (2006-05-29 15:07) [9]
> А вот именно со строковыми ресурсами поджидала меня розовая
> птица Обломинго.
Там несколько сложнее, чем кажется, потому как каждый из поименованных ресурсов представляет из себя StringTable, то есть, группу строк.
Страницы: 1 вся ветка
Текущий архив: 2006.10.08;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.041 c