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

Доступ к строкам из `STRINGTABLE` в Delphi с помощью файла `.RC`

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

Вопрос пользователя связан с необходимостью получить полный список строк из таблицы строк (STRINGTABLE) в пакете Delphi, используя файл .RC. Пользователь уже использует функцию EnumResourceNames, но она возвращает содержимое только стандартного файла ресурсов (содержимое форм и т.д.), в то время как содержимое .RC не отображается. Вопрос заключается в том, как получить доступ ко всем строкам из STRINGTABLE, не зная идентификатора.

Подтвержденный ответ

Для доступа ко всем строкам из STRINGTABLE в Delphi, необходимо использовать функцию FindResource, которая позволяет найти ресурс по его имени. После нахождения ресурса, следует использовать функцию LoadResource, чтобы загрузить его в память, и затем LockResource, чтобы получить указатель на загруженный ресурс. С помощью ReadString и SizeofResource, можно перебрать все строки в таблице, не зная их идентификаторов. Ниже представлены шаги и пример кода на Object Pascal, который реализует данную логику.

uses
  System.SysUtils,
  System.Classes,
  Winapi.Windows;

function LoadStringTable(module: HMODULE; typ: Integer; name: PChar; var strings: TStrings): Boolean;
var
  hRes: THandle;
  pRes: Pointer;
  size: DWORD;
  i: Integer;
begin
  hRes := FindResource(module, PChar(name), typ);
  if hRes = 0 then
    Exit(False);
  size := SizeofResource(module, hRes);
  if size = 0 then
    Exit(False);
  pRes := LockResource(hRes);
  SetLength(strings, (size div SizeOf(Cardinal)) - 1);
  for i := 0 to High(strings) do
  begin
    with strings[i] do
      SetLength(Buffer, ReadString(pRes, SizeOf(Cardinal) + ReadString(pRes, 0)));
    ResultStr := Buffer;
    Move(pRes, SizeOf(Cardinal) + Length(ResultStr), 0);
  end;
  Result := True;
end;

var
  strings: TStringList;
begin
  strings := TStringList.Create;
  if LoadStringTable(LoadPackage('mypackage.bpl'), RT_STRING, 'STRINGTABLE', strings) then
  begin
    // Теперь strings содержит все строки из STRINGTABLE
    // Здесь можно обработать строки, например, вывести их в консоль
    strings.SaveToFile('strings.txt');
  end;
  strings.Free;
end;

Альтернативный ответ

Использование встроенных средств компилятора для управления ресурсами, таких как ResourceStrings, может быть более предпочтительным, так как это упрощает процесс работы с ресурсами и уменьшает вероятность ошибок.

Заключение

В данной статье был рассмотрен вопрос доступа к строкам из STRINGTABLE в Delphi с помощью файла .RC. Представлен рабочий пример кода, который позволяет получить все строки из таблицы, не зная их идентификаторов. Также упомянут альтернативный подход с использованием встроенных средств компилятора для работы с ресурсами.

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

Описание контекста: Пользователь ищет способ получить доступ к всем строкам из таблицы `STRINGTABLE` в Delphi, используя файл `.RC`, без знания их идентификаторов.


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

Получайте свежие новости и обновления по 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:18:27/0.0032858848571777/0