Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

Как извлекать ресурсы RT_RCDATA из файлов   Найти похожие ветки 

 
Игорь Шевченко ©   (2004-02-19 13:13) [0]

Поскольку вопрос KosilkA был справедливо удален за несоответствие правилам оформления вопросов, напишу ответ отдельным постом.

unit main;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
 Menus, StdCtrls;

type
 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 ExtractResource (const ExeName, ResName : string);
 end;

var
 fMain: TfMain;

implementation

{$R *.DFM}

function EnumResNames (HMod : HMODULE; const ResType, ResName : PChar;
 Param : LPARAM) : LongBool; stdcall;
begin
 with TfMain(Param) do
   ListBox.Items.Add(ResName);
 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, ResName: string);
var
 HMod : HMODULE;
 HFindRes : HRSRC;
 HRes : HGLOBAL;
 ResSize : Cardinal;
 ResData : Pointer;
 FileH : Integer;
begin
 HMod := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);
 if HMod <> 0 then
   try
     HFindRes := FindResource(HMod, PChar(ResName), RT_RCDATA);
     if HFindRes <> 0 then begin
       ResSize := SizeOfResource(HMod, HFindRes);
       HRes := LoadResource(HMod, HFindRes);
       if HRes <> 0 then begin
         ResData := LockResource(HRes);
         FileH := FileCreate (ChangeFileExt(ResName, ".DAT"));
         if FileH <> -1 then begin
           FileWrite (FileH, ResData^, ResSize);
           FileClose (FileH);
         end;
       end;
     end;
   finally
     FreeLibrary(HMod);
   end;
end;

procedure TfMain.Open1Click(Sender: TObject);
begin
 if OpenDialog.Execute then begin
   FFileName := OpenDialog.FileName;
   EnumRCData;
 end;
end;

procedure TfMain.btnExtractClick(Sender: TObject);
begin
 ExtractResource(FFileName, ListBox.Items[ListBox.ItemIndex]);
end;

end.


Метод ExtractResource как раз делает, что должен быть делать по замыслу KosilkA

Нетрудно расширить область область применения на другие типы ресуров :)))


 
KosilkA ©   (2004-02-19 13:25) [1]


> Игорь Шевченко ©   (19.02.04 13:13)  

огромное спасибо!



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.038 c
14-1080788841
Kolyan
2004-04-01 07:07
2004.04.25
ASSEMBLER


1-1081457787
noob
2004-04-09 00:56
2004.04.25
Потверждение закрытия приложения.


8-1073224124
Demian3797
2004-01-04 16:48
2004.04.25
Векторная графика


1-1081356485
ArchAngel
2004-04-07 20:48
2004.04.25
Вопрос по созданию хелпов.


7-1076865094
Delphin
2004-02-15 20:11
2004.04.25
Как програмно завершить процесс ?