Форум: "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.038 c