Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

### Как изменить строки ресурсов в Delphi с использованием Win32 API `UpdateResource` ###

Delphi , Синтаксис , Справочник по API-функциям

Как изменить строки ресурсов в Delphi с использованием Win32 API UpdateResource

При разработке программ на Delphi нередко возникает потребность в изменении строк ресурсов, уже встроенных в исполняемый файл. В частности, задача может стоять о модификации таблицы строк (STRINGTABLE) в ресурсах другого приложения. В данной статье мы рассмотрим, как можно использовать функцию Win32 API UpdateResource для изменения строк в таблице ресурсов, собранных в .exe файле, на примере RAD Studio XE7.

Проблема

Разработчик столкнулся с необходимостью изменения строк в таблице ресурсов другого приложения. У него есть два приложения: app1.exe и app2.exe, оба содержат ресурсы STRINGTABLE, добавленные через файлы .rc. Задача заключается в том, чтобы изменить строки в app2.exe с помощью app1.exe, используя функцию UpdateResource из Win32 API.

Решение

Для решения задачи необходимо понять, как устроены строки в ресурсах. Они хранятся блоками по 16 элементов, каждый элемент записывается с указанием размера в 16-битном формате, за которым следуют символы в кодировке UTF-16. Если элемент в блоке не определен явно в исходном RC-файле, он все равно будет присутствовать в собранных ресурсах, но с длиной 0.

Пример кода на Object Pascal (Delphi)

const
  LibName = 'TestLib.dll';
  ID_FIRST  = 1000;
  ID_SECOND = 1001;

function StringIDToGroupID(ID: UINT): UINT; inline;
begin
  Result := (ID shr 4) + 1;
end;

procedure UpdateStrings(const NewFirst, NewSecond: string);
var
  Handle: THandle;
  GroupID: UINT;
  Stream: TCustomMemoryStream;
  GroupStrings: array[0..15] of string;
  StrLen: Word;
  I: Integer;
begin
  GroupID := StringIDToGroupID(ID_FIRST);
  // Получение существующих данных...
  Handle := LoadLibraryEx(LibName, 0, LOAD_LIBRARY_AS_DATAFILE);
  if Handle = 0 then RaiseLastOSError;
  try
    Stream := TResourceStream.CreateFromID(Handle, GroupID, RT_STRING);
    try
      for I := Low(GroupStrings) to High(GroupStrings) do
      begin
        Stream.ReadBufferData(StrLen);
        SetLength(GroupStrings[I], StrLen);
        Stream.ReadBuffer(PChar(GroupStrings[I])^, StrLen * SizeOf(Char));
      end;
    finally
      Stream.Free;
    end;
  finally
    FreeLibrary(Handle);
  end;
  // Обновление интересующих нас строк...
  GroupStrings[ID_FIRST mod Length(GroupStrings)] := NewFirst;
  GroupStrings[ID_SECOND mod Length(GroupStrings)] := NewSecond;
  Stream := TMemoryStream.Create;
  try
    for I := Low(GroupStrings) to High(GroupStrings) do
    begin
      StrLen := Length(GroupStrings[I]);
      Stream.WriteData(StrLen);
      Stream.WriteBuffer(PChar(GroupStrings[I])^, StrLen * SizeOf(Char));
    end;
    // Обновление DLL...
    Handle := BeginUpdateResource(LibName, False);
    if Handle = 0 then RaiseLastOSError;
    try
      UpdateResource(Handle, RT_STRING, PChar(GroupID),
        MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_UK), Stream.Memory, Stream.Size);
    finally
      EndUpdateResource(Handle, False);
    end;
  finally
    Stream.Free;
  end;
end;

Важные моменты

  • Убедитесь, что идентификаторы ресурсов выбираются таким образом, чтобы они группировались по 16 (например, 1000, 1001, 1016, 1017 и т.д.).
  • Перед использованием функции UpdateResource необходимо правильно подготовить данные и указать корректные идентификаторы языка и ресурса.
  • Для работы с ресурсами используется класс TResourceStream, который позволяет читать и записывать данные в потоковом режиме.

Заключение

Изменение строк ресурсов в Delphi с использованием Win32 API UpdateResource требует понимания структуры хранения данных в ресурсах и правильной подготовки потока данных для обновления. Приведенный пример кода демонстрирует, как можно реализовать такое обновление, учитывая особенности хранения строк в ресурсах.

Создано по материалам из источника по ссылке.

Разработчик хочет изменить строки ресурсов в уже собранном исполняемом файле Delphi, используя функцию Win32 API `UpdateResource`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Справочник по API-функциям ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 14:30:19/0.0033190250396729/0