Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.5 MB
Время: 0.059 c
15-1158267945
Mike Petrichenko
2006-09-15 01:05
2006.10.08
-ИЗМы


3-1154528943
VadimSpb
2006-08-02 18:29
2006.10.08
Число параметров


2-1158580517
Id
2006-09-18 15:55
2006.10.08
Картинка в BLOB-e


15-1158072079
zdm
2006-09-12 18:41
2006.10.08
Borland Developer Studio 2006


15-1158296765
wwwrr
2006-09-15 09:06
2006.10.08
44.5