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

Проблемы с EnumResourceNames и пути к решению в Delphi

Delphi , Файловая система , DLL и PlugIns

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

Описание проблемы

Разработчик столкнулся с проблемой при попытке перечисления икон, хранящихся в ресурсах своей собственной библиотеки DLL. При вызове функции EnumResourceNames возвращается ложное значение, а функция GetLastError указывает на ошибку 998 (Недопустимый доступ к расположению памяти). Проблема наблюдается даже после успешной загрузки DLL с помощью LoadLibrary или LoadLibraryEx.

Исследование проблемы

В ходе исследования было обнаружено, что проблема может быть связана с самой DLL, так как замена ее на стороннюю библиотеку устраняет проблему. Однако, также было замечено, что DLL можно открыть в стороннем редакторе икон, и все иконки загружаются корректно. При попытке создания потока ресурсов для конкретного имени иконки возникает исключение "Ресурс [имя] не найден", хотя сторонний редактор иконок его находит.

Решение проблемы

Подтвержденный ответ на проблему заключается в некорректной обработке параметров lpszType и lpszName в функции обратного вызова. Ошибка возникает из-за попытки доступа к памяти процесса через невалидный указатель, когда в параметры передаются идентификаторы ресурсов, а не их имена. Для корректной обработки необходимо проверить, является ли ResName именем или идентификатором, и обработать его соответствующим образом.

Вот пример функции обратного вызова, которая проверяет, является ли ResName именем или идентификатором:

function EnumResFlags( hDll : HMODULE; ResType, ResName : PChar; notUsed : pointer ) : integer; stdcall;
begin
  if IS_INTRESOURCE(ResName) then
    // Обработка идентификатора ресурса
    log(IntToStr(Integer(ResName)))
  else
    // Обработка имени ресурса
    log(ResName);
  // Продолжение обработки...
end;

Если функция IS_INTRESOURCE не определена в вашей версии Delphi, ее можно определить вручную:

function IS_INTRESOURCE(lpszType: PChar): BOOL;
begin
  Result := ULONG_PTR(lpszType) shr 16 = 0;
end;

Заключение

При работе с ресурсами в Delphi важно правильно обрабатывать параметры, передаваемые в функции обратного вызова. В данном случае, некорректная обработка идентификаторов ресурсов привела к ошибке доступа к памяти. Используя предложенные решения, можно избежать подобных проблем и корректно перечислить ресурсы в DLL.

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

Проблема связана с некорректной обработкой параметров функции обратного вызова `EnumResourceNames` в Delphi, что приводит к ошибке доступа к памяти при попытке перечисления ресурсов в DLL.


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

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




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


:: Главная :: DLL и PlugIns ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:51:40/0.00341796875/0