Показать сообщение отдельно
  #11  
Старый 10.12.2010, 16:37
Аватар для BoRoV
BoRoV BoRoV вне форума
Начинающий
 
Регистрация: 08.09.2008
Сообщения: 193
Репутация: 12694
По умолчанию

Вот решил всё вынести в отдельный модуль.

Код:
unit uExtractFileFromResources;
{

  Extracting any resources to file

  Author:  BoRoV
  Date:    10 dec 2010


  Using:
  1. Extracting from itself:
  ...
  if not ExtractResToFile(HInstance, 'BIN', RT_RCDATA, 'C:\file.bin') then
    MessageBox(0, PChar(SysErrorMessage(GetLastError())), 'Error', 16);
  ...

  2. Extracting from another module:
  ...
  hFile: DWORD;
  ...
  hFile := LoadLibrary('C:\file.exe');
  if (hFile <> 0) then
  begin
    if not ExtractResToFile(hFile, 'BIN', RT_RCDATA, 'C:\file.bin') then
      MessageBox(0, PChar(SysErrorMessage(GetLastError())), 'Error', 16);
    FreeLibrary(hFile);
  end;
  ...

}
interface

uses
  Windows;

  // Declaration
  function ExtractResToFile(hInst: DWORD; ResourceName: PChar; ResourceType: PChar; FileName: PChar): Boolean;

implementation

function ExtractResToFile(hInst: DWORD; ResourceName: PChar; ResourceType: PChar; FileName: PChar): Boolean;
var
  hRes, hMod, hFile, dwSize, n: DWORD;
  pBuffer: Pointer;
begin
  Result := False;

  hMod := FindResource(hInst, ResourceName, ResourceType);
  if (hMod <> 0) then
  begin
    dwSize := SizeofResource(hInst, hMod);
    hRes := LoadResource(hInst, hMod);
    if (hRes <> 0) then
    begin
      pBuffer := LockResource(hRes);
      if (pBuffer <> nil) then
      begin
        hFile := CreateFile(FileName, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
        if (hFile <> INVALID_HANDLE_VALUE) then
        begin
          SetFilePointer(hFile, 0, nil, FILE_BEGIN);
          if WriteFile(hFile, pBuffer^, dwSize, n, nil) then
            if (dwSize = n) then
              Result := True;
          CloseHandle(hFile);
        end;
      end;
      FreeResource(hRes);
    end;
  end;
end;

end.
Ответить с цитированием