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

Вниз

Как достучаться до dll ?   Найти похожие ветки 

 
SashkoSoft ©   (2004-09-17 16:28) [0]

Здравствуйте!
Подскажите плз.

Если есть dll с ресурсами, как из программы получить к ним доступ?
Спасибо за ответ!


 
Игорь Шевченко ©   (2004-09-17 16:53) [1]

LoadLibraryEx (PChar(DllName), 0, LOAD_LIBRARY_AS_DATAFILE)
FindResource, LoadResource


 
SashkoSoft ©   (2004-09-17 17:12) [2]

Огромная просьба к Вам, Игорь!
Если Вас не затруднит, раскажите подробнее насчет использования  FindResource и LoadResource...


 
Игорь Шевченко ©   (2004-09-17 17:16) [3]

Я примером, если можно :)

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.


 
SashkoSoft ©   (2004-09-17 17:22) [4]

М-да :)))
Спасибо :)))

А у Вас нету примерчика попроще? с коментами?


 
SashkoSoft ©   (2004-09-17 17:23) [5]

у меня длл, с ресурсами, в качестве ресурсов - 3 джипега, мне-бы как-то достать их из программы....


 
Игорь Шевченко ©   (2004-09-17 17:37) [6]


> А у Вас нету примерчика попроще? с коментами?


Ответы на форуме бесплатные :)


 
SashkoSoft ©   (2004-09-17 17:40) [7]

:)
Ну что Вам стоит.... :)


 
Игорь Шевченко ©   (2004-09-17 17:45) [8]

Извиняюсь, что именно ? Специально писать для вас пример и снабжать его комментариями, тратя свое время и трафик ?
А почему, собственно, я должен его тратить из-за того, что вам лень разобраться в справке или в моем примере ?


 
Dimaxx   (2004-09-18 00:48) [9]

2 SashkoSoft: Упрощенно...

var
 H: THandle;
 JPG: TJpegImage;
...
H:=LoadLibrary("my.dll");
...
JPG.LoadFromResourceName(H,"JPEGIMAGE","MYJPEG");
...
FreeLibrary(H);



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

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

Наверх




Память: 0.5 MB
Время: 0.052 c
1-1097498396
Ivan_
2004-10-11 16:39
2004.10.24
Не работают компоненты


14-1096062906
Мазут Береговой
2004-09-25 01:55
2004.10.24
А такая тема была уже? Про дырку в JPEG.


1-1097151547
Антон
2004-10-07 16:19
2004.10.24
Генерация события onKeyDown


14-1096730173
QuestionX
2004-10-02 19:16
2004.10.24
Множество try except finally ?


1-1096554966
Devel
2004-09-30 18:36
2004.10.24
AV при использовании TXMLDocument