| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Visual C++/MFC/WTL > Работа с ресурсами из DLL |
| Автор: GoRam 21.11.2008, 20:27 |
| Всем привет. У меня такая проблемма, мне нужно загрузить ресырсы из DLL библиотеки, в ней есть 3 картинки IDB_BMP1 IDB_BMP2 IDB_BMP3. можно ли загрузить их так, чтобы я мог к ним обращаться как к стандартным ресурсам программы, просто у меня есть функчия которая просит чтобы ей передали картинку из ресурсов, а как загрузить из DLL чтобы передать не знаю. Вот сама функция void SetBitmaps(UINT nBmp1, UINT nBmp2) вызываю так m_bm.SetBitmaps(IDB_BITMAP1, IDB_BITMAP2); при подключении и загрузки библиотеки пишу m_bm.SetBitmaps(IDB_BMP1, IDB_BMP2); вылетает с ошибкой типа нету IDB_BMP1 и IDB_BMP2 |
| Автор: Kallikanzarid 21.11.2008, 21:31 |
| Не знаю насчет MFC, но в WinAPI функции вроде LoadIcon, LoadCursor и т. д. принимают в качестве первого параметра HMODULE, т.е. например загруженную библиотеку. Не вижу ничего дурного в том, чтобы загружать ресурсы через WinAPI, а затем оборачивать в классы MFC. |
| Автор: Earnest 22.11.2008, 17:21 | ||
| Чтобы остаться в рамках MFC, можно временно установить нужный модуль ресурсов вызовом AfxSetResourceHandle (hDll). Перед этим сохрани текущий модуль ресурсов (AfxGetResourceHandle() его возвращает), чтобы потом вернуть на место. Лучше всего это дело обернуть в класс по принципу RAII:
MFC ищет ресурсы так: сначала в модуле, который установлен как resourse module, потом в EXE и по всей цепочке extension DLL. Вышеприведенным кодом ты временно изменяешь порядок поиска. Причем, если у тебя все ресурсы имеют уникальные номера и DLL типа extension, то все это делать не надо - и так найдутся. Другое дело, что в больших проектах поддерживать уникальность ресурсов довольно утомительно, вот тогда можно временно переключать resourse handle. Или если DLL имеет тип regular - тоже придется переключать. |
| Автор: GoRam 24.11.2008, 19:13 |
| большое спасибо за то что объяснили |