Вопрос пользователя связан с необходимостью получить полный список строк из таблицы строк (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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.