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

Вниз

Как достучаться до 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 вся ветка

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

Наверх




Память: 0.49 MB
Время: 0.036 c
14-1096791416
Profi
2004-10-03 12:16
2004.10.24
Отличие игр от других программ


3-1096284226
Term
2004-09-27 15:23
2004.10.24
Как организовать мастер детайл с компонентами ADO


1-1097307670
Kolan
2004-10-09 11:41
2004.10.24
Перенос series


14-1096905347
Lord de Mon
2004-10-04 19:55
2004.10.24
Book


1-1097392068
lid
2004-10-10 11:07
2004.10.24
MDI





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский