Error rlink32 too many resources to handle

If you have many DFM files and RES files in your project you may run into the rlink32 error “Too many resources to handle”. Every DFM file is one resource and a RES file can contain multiple resources. All together must not exceed 3626 resources.

If you have many DFM files and RES files in your project you may run into the rlink32 error “Too many resources to handle”. Every DFM file is one resource and a RES file can contain multiple resources. All together must not exceed 3626 resources.

This limit comes from how rlink32 pre-allocates memory for all resources.  The following pseudo code shows the memory allocator.

function AllocateResourceArray(var AllocatedSize: Word): PResourceArray;
var
  Size: Integer;
begin
  Size := $FF00;
  repeat
    Result := GetMemory(Size);
    if Result <> nil then
    begin
      AllocatedSize := Size;
      Exit;
    end;
    Dec(Size, $400);
  until Size < $400;
  AllocatedSize := 0;
end;


There is an easy fix without much code change:
As you can see the max. number of bytes for the whole resource array is limited by $FF00 (65280) bytes. A resource array item’s size is 18 Bytes. That makes 3626 items. If the memory allocator can’t allocate enough memory it tries to allocate again with 1024 bytes less. So the max. number of resources can be lower than 3626. But wait, we have 2014 and not 1992 (rlink32.dll’s copyright message) and RAM is like sand on the beach, at least some developer think that. The 64KB age is long gone, but due to this function rlink32 will fail with “Too many resources to handle” if the 3627’s resource is processed.

Change the var-parameter from “Word” to “LongWord” and set the initial size to $11FFDC (1,179,612 bytes) which makes room for 65534 resource items which should be enough at the moment. Adjust the code that calls into this function (there is only one call). Recompile rlink32.dll.

Unfortunately I can’t recompile rlink32.dll due to the lack of source code, so I need to patch the machine code. And changing the data type from “Word” to “LongWord” isn’t that easy as you have to patch a lot more places that the compiler would just generate for you (fortunately the 32-bit opcodes are usually smaller than the 16-bit opcodes).

This bug fix for the rlink32 error will be in the next version 5.7 of IDE Fix Pack (for the IDE compiler) and fastdcc (for the command line compiler).

 
Alextp ©
 
(2006-02-12 10:45)
[0]

Hi All,

При компиляции D5 IDE выдает: «RLINK32: Too many resources to handle». При этом dcc32.exe компилирует нормально. Hаверное, дело в том, что .res файл у меня сделан вручную, через .rc (когда его удаляешь, компилируется нормально). Как быть — компилировать только через dcc32.exe, или это исправляется?


 
Desdechado ©
 
(2006-02-12 16:01)
[1]

Операционка какая?

PS rlink не компилирует, а собирает EXE


 
API
 
(2006-02-12 19:32)
[2]

Hаверное, дело в том, что .res файл у меня сделан вручную, через .rc

Принципиально не имеет никакого значения.
Ресурс компилировали brcc32.exe?


 
Alextp ©
 
(2006-02-12 23:31)
[3]

Операционка Win98, хотя вряд ли это важно.
Ресурс компилировал brc32.exe (не brcc32.exe):

Borland Resource Compiler / Binder
Version 5.40 Copyright (c) 1992, 1999 Inprise Corporation


 
McSimm ©
 
(2006-02-12 23:38)
[4]

Попробуйте закрыть проект, удалить <имя проекта>.res и открыть проект, чтобы IDE пересоздала файл.


 
Германн ©
 
(2006-02-13 01:59)
[5]

> McSimm ©   (12.02.06 23:38) [4]
>Попробуйте закрыть проект, удалить <имя проекта>.res и открыть проект, >чтобы IDE пересоздала файл

Нет. Автор сабжа указал — «Hаверное, дело в том, что .res файл у меня сделан вручную, через .rc»


 
McSimm ©
 
(2006-02-13 02:09)
[6]

Имеется в виду удаление и пересоздание «родного» файла ресурсов проекта, после чего, возможно, перестанет возникать ошибка при подключении своего при компиляции.


 
Германн ©
 
(2006-02-13 02:17)
[7]


> McSimm ©   (13.02.06 02:09) [6]

Да, но автор, наверно, имел какие-то мотивы сформировать сей ресурс «вручную». Или требуется уточнения какой именно .res файл был создан автором «вручную».


 
DrPass ©
 
(2006-02-13 10:36)
[8]

Мне в свое время помогла избавиться от такой же ошибки замена подключенного к проекту res-файла на исходный rc-файл. После того, как Delphi стала сама его компилировать, ошибка пропала.


 
Alextp ©
 
(2006-02-13 13:02)
[9]


> Имеется в виду удаление и пересоздание «родного» файла ресурсов
> проекта,

Вручную был создан файл <имя проекта>.res, в нем через .rc были подключены доп. ресурсы, в том числе MAINICON. Он и есть головной файл ресурсов. Зачем его пересоздавать?


> Мне в свое время помогла избавиться от такой же ошибки замена
> подключенного к проекту res-файла на исходный rc-файл.

А как подключить .rc файл, через {$R name.rc} или еще как?


 
McSimm ©
 
(2006-02-13 14:28)
[10]


> Вручную был создан файл <имя проекта>.res

В таком случае, наверное стоит все-таки разделить, свои ресурсы вынести в свой отдельный файл ресурсов, автосоздаваемый оставить в покое.

Не могу сейчас привести обоснованных аргументов, это было очень давно и тогда они были, сейчас в памяти остался только solution :)


 
kaZaNoVa ©
 
(2006-02-13 16:18)
[11]

Alextp ©   (12.02.06 23:31) [3]
Операционка Win98, хотя вряд ли это важно.

это имхо очень важно, у меня на 9х постоянно такие ошибки время от времени возникали в разных местах .. — нехватка системных ресурсов — у 9х систем их мало ..

решение — поставить 2000


 
kaZaNoVa ©
 
(2006-02-13 16:19)
[12]

Alextp ©   (12.02.06 10:45)
При этом dcc32.exe компилирует нормально

потому что много ресурсов, занятых IDE  свободно .. :)


 
Anatoly Podgoretsky ©
 
(2006-02-13 16:30)
[13]

Alextp ©   (13.02.06 13:02) [9]
Вручную был создан файл <имя проекта>.res, в нем через .rc были подключены доп. ресурсы, в том числе MAINICON. Он и есть головной файл ресурсов. Зачем его пересоздавать?

Вот это ты напрасно, данный файл только для проекта, убери от него свои руки.


 
Alextp ©
 
(2006-02-13 22:13)
[14]


> В таком случае, наверное стоит все-таки разделить, свои
> ресурсы вынести в свой отдельный файл ресурсов, автосоздаваемый
> оставить в покое.
> Не могу сейчас привести обоснованных аргументов, это было
> очень давно и тогда они были, сейчас в памяти остался только
> solution :)

Solution подошел. :) Я разнес свой файл ресурсов и файл по умолчанию, файл по умолчанию пересоздал, и теперь компилируется нормально. Спасибо!


 
Германн ©
 
(2006-02-14 03:08)
[15]


> Solution подошел. :) Я разнес свой файл ресурсов и файл
> по умолчанию, файл по умолчанию пересоздал, и теперь компилируется
> нормально. Спасибо!

Что и требовалось доказать!


 
Германн ©
 
(2006-02-14 03:19)
[16]

И ещё раз УВЫ!
Ну кто тут помешал Борланду разрешить редактировать файл ресурсов проекта «его же (т.е. Борландовскими средствами)»?

Это — риторический вопрос!


Я получаю следующую ошибку, когда пытаюсь связать ресурсы в dll.

[Ошибка DCC] E2161 Ошибка: RLINK32: слишком много ресурсов для обработки.

Количество ресурсов более 10К.

Я не уверен, есть ли ограничение на размер имен ресурсов в dll.
https://forums.codegear.com/message.jspa?messageID=58473

Есть ли способ добавить больше ресурсов в dll.

-Паван.

5 ответы

В качестве обходного пути вы можете объединить связанные изображения в одно изображение, а затем нарезать нужные фрагменты во время выполнения. Например, так работают элементы управления списком изображений Windows.

Создан 18 сен.

Разделите ресурсы на разные библиотеки DLL или выберите контейнер для хранения файлов (например, какую-нибудь встроенную базу данных, такую ​​как SQL Lite, хранилище Eldos SoLFS, хранилище единой файловой системы AidAim или вашу собственную реализацию), которые можно прикрепить в конце исполняемого файла, если возможно (поскольку вы использовали Delphi 2009, вы можете сделать это с помощью команд Post-Build). Если вы выберете второй способ, ваша программа будет использовать меньше памяти, поскольку раздел ресурсов будет меньше, также в зависимости от реализации вы также можете защитить изображения с помощью шифрования или даже сжать их. Единственный минус в том, что вам придется создавать собственные процедуры загрузки для загрузки данных png в ваши объекты (не слишком сложно).

Создан 18 сен.

Компания Компоненты PNG есть компонент TPngImageCollection. Возможно, это подойдет вам.

Создан 18 сен.

Я сам не сталкивался с этой ошибкой, но если бы я это сделал, я бы первым делом попытался разделить свои ресурсы на отдельные файлы RES.

Возможно, «слишком много» — это слишком много за один раз, и разделение ресурсов по нескольким файлам res может разбить все на более управляемые фрагменты, с которыми RLINK32 сможет справиться.

Но это всего лишь догадки с моей стороны.

Создан 18 сен.

От отсутствия изменений кода до дополнительных модификаций:
1. попробуй сократить названия своих ресурсов
2. разделить вашу dll на несколько с меньшим количеством ресурсов (хороший способ организовать их по характеру или теме)
3. объедините ваши ресурсы изображений в полосы с несколькими изображениями (хорошо работает для значков, глифов и т. д., когда размер одинаковый)

Создан 18 сен.

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

delphi

or задайте свой вопрос.

Понравилась статья? Поделить с друзьями:
  • Error rlink32 out of memory
  • Error rlink32 error writing file
  • Error rlink32 error opening file
  • Error reverse was not declared in this scope
  • Error reverb node does not exist ac reverb 0