
10.12.2010, 16:37
|
 |
Начинающий
|
|
Регистрация: 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.
|