Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с ресурсами из DLL, помогите срочно нужно. 
:(
    Опции темы
GoRam
Дата 21.11.2008, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.8.2008

Репутация: нет
Всего: 1



Всем привет. У меня такая проблемма, мне нужно загрузить ресырсы из 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
PM MAIL   Вверх
Kallikanzarid
Дата 21.11.2008, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 240
Регистрация: 9.11.2008

Репутация: нет
Всего: 3



Не знаю насчет MFC, но в WinAPI функции вроде LoadIcon, LoadCursor и т. д. принимают в качестве первого параметра HMODULE, т.е. например загруженную библиотеку. Не вижу ничего дурного в том, чтобы загружать ресурсы через WinAPI, а затем оборачивать в классы MFC.
PM MAIL   Вверх
Earnest
Дата 22.11.2008, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Чтобы остаться в рамках 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 - тоже придется переключать.


--------------------
...
PM   Вверх
GoRam
Дата 24.11.2008, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 4.8.2008

Репутация: нет
Всего: 1



большое спасибо за то что объяснили
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.