Ошибка FindResource

У меня есть такой кусок кода

  IDB_PNG1                PNG                     "images\\list-back.png"
  HRSRC hrsrc = FindResource(module, MAKEINTRESOURCE(IDB_PNG1), TEXT("PNG")); 

это работает нормально,
но я не могу заставить его работать ни в одном из вариантов ниже

  hrsrc = ::FindResource(module, L"images\\list-back.png", L"PNG");
  hrsrc = ::FindResource(module, L"images\\list-back", L"PNG");
  hrsrc = ::FindResource(module, L"list-back.png", L"PNG");
  hrsrc = ::FindResource(module, L"list-back", L"PNG");

GetlastError возвращает 0x00000716 Указанное имя ресурса не может быть найдено в файле изображения.
Каков правильный формат строки/способ поиска по строке?

Изменить: будет создан файл .rc, содержащий файлы .html и .png. Я хочу иметь возможность находить и загружать эти файлы без перекомпиляции исполняемого файла. Мне нужно как-то определить в .html, что использует .png, в exe я получу этот путь/идентификатор, чем FindResource и загрузку. Можно ли это сделать?


person cprogrammer    schedule 27.04.2011    source источник
comment
только что была аналогичная проблема - пытался найти ресурс с помощью MAKEINTRESOURCE (ID), и это не сработало, но при изменении на FindResource (TEXT (ID), ..) это чудесным образом сработало. похоже на то, что предложил @EFraim   -  person estoy    schedule 13.01.2017


Ответы (2)


Первая запись в строке RCDATA — это имя (или идентификатор). Последняя запись просто «что должен использовать компилятор ресурсов для создания этой записи» — имя не сохраняется в исполняемом файле.

FOO  RCDATA  "images\\list-back.png"

...

::FindResource(module, L"FOO", RT_RCDATA);
person Erik    schedule 27.04.2011
comment
Не работает и в любом случае бесполезен для меня, потому что я не могу получить строку IDB_PNG1 или int. Я получаю images\\list-back.png в обратном вызове для ресурса - person cprogrammer; 27.04.2011
comment
@cprogrammer: используйте RCDATA, и это сработает. Имя файла, используемое для создания ресурса, не хранится в таблице ресурсов — имя/идентификатор сохраняется. - person Erik; 27.04.2011
comment
Я все еще должен использовать MAKEINTRESOURCE(FOO), не работает с FOO. По крайней мере, если ресурс находится в dll, а вызов в exe. Я посмотрел с помощью PEExplorer, и вы правы, путь не хранится в таблице ресурсов - это мертвый способ, но мне нужно найти способ связать ресурс в .rc (rc будет сгенерирован) таким образом, чтобы Я могу найти этот ресурс из exe (без перекомпиляции exe). - person cprogrammer; 27.04.2011

Кроме того, вы можете сохранить ресурс со строковым идентификатором вместо числового идентификатора, например:

list-back PNG "images\\list-back.png"

Тогда вы действительно можете сделать:

hrsrc = ::FindResource(module, L"list-back", L"PNG");

Это менее эффективно, чем решение, предоставленное Эриком, но может быть более управляемым, если вы пытаетесь получить доступ к какому-либо ресурсу, скажем, из статической библиотеки, тогда как сам ресурс встраивается в DLL/EXE на более позднем этапе. (Тогда вам не нужно знать числовой идентификатор, просто договоритесь о символическом имени для ваших модулей)

person EFraim    schedule 30.08.2015