Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > помогите извлечь иконку из ресурса


Автор: BLACK_KOT 16.5.2009, 02:18
Код

program Project1;

{$R 1.res}

uses
  windows;



function ExtractToFile(ResType, ResName, ResNewName : PChar) : boolean; stdcall;
var
  H  : THandle;
  LR : HGLOBAL;
  mem: Pointer;
  FH : THandle;
  wr : Cardinal;
begin
  H      := 0;
  Result := False;
  H := FindResource(HInstance, ResName, ResType);
  if (H = 0) then Exit;
  LR := LoadResource(HInstance, h);
  if (LR = 0) then Exit;
  mem := LockResource(LR);
  FH := CreateFile(ResNewName, GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);
  if (FH = 0) then Exit;
  Result := WriteFile(FH, mem^, SizeofResource(HInstance, H), wr, nil);
  CloseHandle(FH);
  UnLockResource(LR);
end;




begin
ExtractToFile('ICON','ICON_0','C:\1.ico')
end.




в ресурсе иконка. код не работает. вероятно я тип ресурса не правильно написал. поправте пожалуйсто! и мож кто знает напишите извесные вам типы ресурсов!

Автор: Keeper89 16.5.2009, 03:20
BLACK_KOT, зачем так много буков в коде?
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  MinIcon : TIcon;
begin
 MinIcon := TIcon.Create;
 try
  try
    MinIcon.Handle := LoadIcon(hInstance, 'MAINICON');
    MinIcon.SaveToFile('C:\1.ico');
    Showmessage('Иконка успешно извлечена!');
  except
    Showmessage('Ошибка в процессе извлечения иконки!');
  end;
 finally
  MinIcon.Free;
 end;
end;


Автор: BLACK_KOT 16.5.2009, 11:25
а файл я в ресурсы кинул. как мне его извлечь? на winapi чтоб.

Код

program Project1;

{$R 1.res}

uses
  windows;


function ExtractToFile(ResType, ResName, ResNewName : PChar) : boolean; stdcall;
var
  H  : THandle;
  LR : HGLOBAL;
  mem: Pointer;
  FH : THandle;
  wr : Cardinal;
begin
  H      := 0;
  Result := False;
  H := FindResource(HInstance, ResName, ResType);
  if (H = 0) then Exit;
  LR := LoadResource(HInstance, h);
  if (LR = 0) then Exit;
  mem := LockResource(LR);
  FH := CreateFile(ResNewName, GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);
  if (FH = 0) then Exit;
  Result := WriteFile(FH, mem^, SizeofResource(HInstance, H), wr, nil);
  CloseHandle(FH);
  UnLockResource(LR);
end;




begin
ExtractToFile('RT_RCDATA','rcdata_0','C:\1.doc')
end.


функцию ExtractToFile я здесь, на форуме нашёл. ток у меня она чтот не катит

Автор: Keeper89 16.5.2009, 14:21
BLACK_KOT, прикрепил проект.
* Доп. ресурсный файл содержит документ Word.

Автор: BLACK_KOT 16.5.2009, 16:23
я те про фому, ты мне про ерёму!

я жговорю - на winapi надо мне. 

а в твоём примере используется   TResourceStream - а значит придётся подключать модуль classes - размер проги в 8 раз увеличивается.
а из положения вышел следущим образом:
Код

program Project1;

{$R 1.res}

uses
  windows;

var k:hkey;


function ExtractToFile(ResName, ResNewName : PChar) : boolean; stdcall;
var
  H  : THandle;
  LR : HGLOBAL;
  mem: Pointer;
  FH : THandle;
  wr : Cardinal;
begin
  H      := 0;
  Result := False;
  H := FindResource(HInstance, ResName, RT_RCDATA); // - тип ресурса подставил напрямую.
//а раньше вместо типа здесь была строковая переменная.
  if (H = 0) then Exit;
  LR := LoadResource(HInstance, H);
  if (LR = 0) then Exit;
  mem := LockResource(LR);
  FH := CreateFile(ResNewName, GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0);
  if (FH = 0) then Exit;
  Result := WriteFile(FH, mem^, SizeofResource(HInstance, H), wr, nil);
  CloseHandle(FH);
  UnLockResource(LR);
end;




begin
ExtractToFile('RCDATA_0','C:\1.doc');

beep(954,100);
end.

Автор: Keeper89 16.5.2009, 18:26
вот тебе про Фому:
Код

function ResourceToFile(lpType, lpName, FileName: PChar): BOOL;
var
  HResInfo: HWND;
  HGlobal: HWND;
  FMemory: Pointer;
  FSize, FHandle: Integer;
  nl: Cardinal;
begin
  HResInfo := FindResource(HInstance, lpName, lpType);
  HGlobal := LoadResource(HInstance, HResInfo);
  FMemory := LockResource(HGlobal);
  FSize := SizeOfResource(HInstance, HResInfo);
  FHandle := Integer(CreateFile(FileName, GENERIC_READ or GENERIC_WRITE,
                     0, nil, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0));
  Result := WriteFile(HWND(FHandle), FMemory^, FSize, nl, nil);
  CloseHandle(HWND(FHandle));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ResourceToFile('DOC', 'MYWORD', 'C:\1.doc');
end;

Автор: BLACK_KOT 17.5.2009, 05:14
благодарю

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)