Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Модуль работы с ресурсами в PE файлах


Автор: Alex 21.10.2004, 16:37
Для общего пользования выкладывается модуль работы с ресурсами в PE файлах, который корректно работает во всех версиях Windows. За основу был взят модуль работы с ресурсами компании Mathias Rauen, www.madshi.net.

Возможности:
1. Извлечение иконок из ресурсов без потери их цветовой гаммы и с сохранением всех вложенных иконок.
2. Добавление нового ресурса
3. Изменение существующего ресурса
4. Удаление ресурса
5. Работа с ресурсами различных языков
и т. д.

Работа над модулем будет продолжена. Свежую версию, вы всегда можете скачать по адресу http://alex-co.com.ru/delphi/modules/acWorkRes.rar

Примеры:
1. Подмена Bitmap ресурса с явным заданием языка ресурса:
Код
var
  hUpdateRes: THandle;
begin
  hUpdateRes:= BeginUpdateResourceW('Путь к файлу', FALSE);
  if not LoadBitmapResourceW(hUpdateRes, 'Имя ресурса', 1049,'e:\Temp\123.bmp') then
    showMessage('');
  EndUpdateResourceW(hUpdateRes, FALSE);

2. Подмена Bitmap ресурса без явного задания языка ресурса:
Код
var
  hUpdateRes: THandle;
begin
  hUpdateRes:= BeginUpdateResourceW('Путь к файлу', FALSE);
  notLang:= True;
  try
    if not LoadBitmapResourceW(hUpdateRes, 'Имя ресурса', 0,'e:\Temp\123.bmp') then
    showMessage('');
  finally
    notLang:= False;
  end;
  EndUpdateResourceW(hUpdateRes, FALSE);

3. Переименование производителя программы:
Код
uses
  acWorkRes;
...

threadvar
  ResName : PChar; // эта переменная нужна!

procedure ChangeCompany (FileName : string; NewCompany : string);
const
  StringFileInfo = 'StringFileInfo';
  CompanyName = 'CompanyName';

var
  hUpdate : THandle;
  hExe : HMODULE;
  Data : WideString;
  ResInfo : HRSRC;
  ResData : HGLOBAL;
  Adr : Pointer;
  Size : DWORD;
  i0, i00, i, l, delta : integer;
  NewCompanyZ : string;

  function EnumFunc (hMod : HMODULE; lpszType : LPCTSTR; lpszName : LPTSTR; lParam : integer) : BOOL; stdcall;
  begin
   ResName := lpszName;
   Result := False;
  end;

begin
  hExe := LoadLibrary (PChar(FileName));
  if hExe = 0 then Exit;
  ResName := nil;
  EnumResourceNames (hExe, RT_VERSION, @EnumFunc, 0);

  ResInfo := FindResource (hExe, ResName, RT_VERSION);
  if ResInfo = 0 then Exit;
  ResData := LoadResource (hExe, ResInfo);
  Adr := LockResource (ResData);
  Size := SizeofResource (hExe, ResInfo);
  SetLength(Data, Size div 2);
  CopyMemory (@Data[1], Adr, Size);
  FreeResource (ResData);
  FreeLibrary (hExe);

  NewCompanyZ := NewCompany + #0;
  while (Length(NewCompanyZ) mod 2) <> 0 do NewCompanyZ := NewCompanyZ + #0;

  i00 := Pos(StringFileInfo, Data);
  if i00 = 0 then Exit;

  i0 := PosEx(CompanyName, Data, i00);
  if i0 = 0 then Exit;

  i := i0 + Length(CompanyName);
  while Data[i] = #0 do Inc(i);
  l := 0;
  while Data[i+l] <> #0 do Inc(l);
  while Data[i+l] = #0 do Inc(l);
  Delete (Data, i, l);
  Insert (NewCompanyZ, Data, i);

  delta := (Length(NewCompanyZ) - l);
  Data[i0-3] := WideChar( Word(Data[i0-3]) + delta*2 ); // размер CompanyName
  Data[i0-2] := WideChar(Length(NewCompany)+1); // длина нового производителя
  Data[i00-3] := WideChar( Word(Data[i00-3]) + delta*2 ); // размер StringFileInfo

  Size := Length(Data)*2;
  Data[1] := WideChar(Size);

  hUpdate := BeginUpdateResourceW(StringToPWide(FileName), False);
  notLang:= True;
  try
    UpdateResourceW(hUpdate, PWideChar(RT_VERSION), PWideChar(ResName), 0, @Data[1], Size);
  finally
    notLang:= False;
  end;
  EndUpdateResourceW(hUpdate, False);
end;

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