Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.133.82.244] |
|
Сообщ.
#1
,
|
|
|
procedure ExportData(Path, AName, AType: String; Data: TFileStream); overload; var hFile: HWND; Buf: array of Byte; begin hFile := BeginUpdateResource(PChar(Path), False); try if hFile = 0 then begin RaiseLastOSError; end; SetLength(Buf, Data.Size); Data.Position := 0; Data.Read(Buf[0], Data.Size); if not UpdateResource(hFile, PChar(AType), PChar(AName), 0, @Buf[0], Data.Size) then RaiseLastOSError; Finalize(Buf); finally EndUpdateResource(hFile, False); end; end; Data := TFileStream.Create('c:\1.txt', fmOpenRead); try ExportData('c:\test.exe', 'test', 'sometype', Data); finally Data.Free; end; procedure ExtractRes(Path: String); begin ForceDirectories(Path); with TResourceStream.Create(HInstance, 'sometype', 'test') do try Position := 0; SaveToFile(Path + '1.txt'); finally Free; end; end; Пример вызова: ExtractRes('c:\extract\'); Цитата x2er0 @ И, как можно узнать, .exe файлу, что есть в нем этот ресур или нет, на случай - можно уже извлекать или еще нет?! var ResourceName : array of ShortString; function GetResourceList: Boolean; var Errors: Cardinal; function CallBack(hModule: HMODULE; lpType: PChar; lpzName: LPTSTR; lParam: Longint): BOOL; stdcall; var Size: Cardinal; begin Result := True; if Assigned(lpzName) then begin Size := Length(ResourceName); Inc(Size); SetLength(ResourceName, Size); ResourceName[Size - 1] := ShortString(lpzName); end; end; begin Result := True; ResourceName := nil; Errors := 0; EnumResourceNames(HInstance, 'sometype', @CallBack, 0); end; Добавлено для этого измени в первом коде вот эту строку: if not UpdateResource(hFile, PChar(AType), PChar(AName), 0, @Buf[0], Data.Size) then RaiseLastOSError; if not UpdateResource(hFile, PChar(AType), PChar(AName), 0, nil, 0) then RaiseLastOSError; после этого создавай свою копию, удаляй у копии ресурс и заеняй себя копией (к примеру через батник) |