Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Вниз

Ресурсные строки   Найти похожие ветки 

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.10.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.041 c
1-1156592778
SergV
2006-08-26 15:46
2006.10.08
OleContainer + любой браузер


3-1154815736
lexander
2006-08-06 02:08
2006.10.08
ADO + агрегирование (access)


1-1156368478
Толян
2006-08-24 01:27
2006.10.08
scktsrvr.exe


2-1158734182
yel
2006-09-20 10:36
2006.10.08
Как узнать открыт или закрыт CD-ROM?


3-1155098797
al_tor
2006-08-09 08:46
2006.10.08
Ошибка при вызове ADOQuery





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский