Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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:

Код

class CSwitchResourceHandle
{
public:
   CSwitchResourceHandle (HINSTANCE hResourceModule)
   {
      m_hSavedResModule = AfxGetResourceHandle();

      ASSERT( hResourceModule != INVALID_HANDLE_VALUE );
      AfxSetResourceHandle (hResourceModule ? hResourceModule : AfxGetApp()->m_hInstance);
   }
   ~CSwitchResourceHandle()
  {
     AfxSetResourceHandle (m_hSavedResModule);
   }

private:
   HINSTANCE m_hSavedResModule;
};


MFC ищет ресурсы так: сначала в модуле, который установлен как resourse module, потом в EXE и по всей цепочке extension DLL.
Вышеприведенным кодом ты временно изменяешь порядок поиска. Причем, если у тебя все ресурсы имеют уникальные номера и DLL типа extension, то все это делать не надо - и так найдутся. Другое дело, что в больших проектах поддерживать уникальность ресурсов довольно утомительно, вот тогда можно временно переключать resourse handle.
Или если DLL имеет тип regular - тоже придется переключать.

Автор: GoRam 24.11.2008, 19:13
большое спасибо за то что объяснили

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)