Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Вопрос по получению списка ресурсов файла. Нестыковочка. 
:(
    Опции темы
AndreySol
Дата 13.7.2005, 05:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел в MSDN пример (статья называется "Using Resources") как получить список ресурсов EXE или DLL файла с указанием типа и имени ресурса. Статья состоит из двух примеров - один: как имея имя ресурса загрузить его с помощью FindResource и LoadResource, а второй: как получить список имен всех ресурсов используя EnumResourceTypes.
Ну сделал пробную програмку получения списка ресурсов, все вроде получилось. А потом естественно решил попробовать используя эти полученные имена ресурсов, загрузить к примеру иконку из файла. И тут облом - когда пытаюсь загружать ресурс, используя полученное имя ничего не выходит, получается постоянно "Ресурс не найден".
Может кто знает как правильно "состыковать" эти два примера ?
PM MAIL   Вверх
Earnest
Дата 14.7.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Функция EnumResourceTypes перебирает лишь типы ресурсов, которые есть в приложении (диалоги, строки и т.д.). Можно пропустить - тебя ведь конкретные ресурсы интересуют?
Чтобы добраться до имен ресурсов, нужно использовать EnumResourceNames, а там еще с языками нужно разобраться. Вот пример для строк (все надергано из кода как попало, но надеюсь, понятно):

Код

void foo()
{
   // так мы добираемся до строк - в последний аргумент - lParam - можно передать что-нибудь полезное    
   EnumResourceNames(hInst,RT_STRING,OnResNameProc,0);
}

// обработать локализованные ресурсы
BOOL CALLBACK OnResNameProc(HINSTANCE hInst,LPCTSTR psType,LPTSTR psName,LONG lPar)
{
   // если с языками нет вопросов, можно не перебирать их, а сразу доступаться до ресурса, как в следующей ф-и    
   EnumResourceLanguages(hInst,psType,psName,OnLangResProc,lPar);
   return TRUE;
}

// перебор английских ресурсов 
BOOL CALLBACK OnLangResProc(HINSTANCE hInst,LPCTSTR psType,LPCTSTR psName,
                                                                  WORD wLanguage,LONG lPar)
{
   //  только английские ресурсы!!!
  WORD nPrimLang = PRIMARYLANGID(wLanguage);
  if (nPrimLang!=LANG_ENGLISH) return TRUE;

  // это классик, который умеет загружать ресурсы, см ниже 
  CBinResData Res(hInst,psName,psType,wLanguage);
   if (!Res.Data()) return TRUE;

   if (psType == RT_STRING)
      // ... что-нибудь делаем
   else if (psType == RT_MENU)
      // ...
   else
    // и т.д.  

  return TRUE;
}

// класс для загрузки произвольных бинарных ресурсов
class CBinResData
{
public:
   CBinResData(HMODULE,LPCTSTR psName,LPCTSTR psType,WORD wLang=0);
   CBinResData(HMODULE,HRSRC);

   HMODULE  Module() const { return m_hMod;  }
   HRSRC    Rsrc()   const { return m_hRsrc; }
   LPBYTE   Data()   const { return m_pData; }
   DWORD    Size()   const { return m_nSize; }

private:
   HMODULE  m_hMod;
   HRSRC    m_hRsrc;
   LPBYTE   m_pData;
   DWORD    m_nSize;
};

CBinResData::CBinResData(HMODULE hModule,LPCTSTR psName,LPCTSTR psType,WORD wLang):
   m_hMod(hModule),
   m_pData(0),
   m_nSize(0),
   m_hRsrc(0)
{
   ASSERT(hModule);
   m_hRsrc = wLang ? FindResourceEx(m_hMod,psType,psName,wLang):
                     FindResource(m_hMod,psName,psType);
   if (m_hRsrc) 
   {
      HGLOBAL hGlob = LoadResource(m_hMod,m_hRsrc);
      if (!hGlob) CSysException::Throw();

      m_pData = (LPBYTE)LockResource(hGlob);
      m_nSize = SizeofResource(m_hMod,m_hRsrc);
      if (!m_pData || !m_nSize) CSysException::Throw();
   }
}

CBinResData::CBinResData(HMODULE hModule,HRSRC hRsrc):
   m_hMod(hModule),
   m_hRsrc(hRsrc)
{
   m_pData = (LPBYTE)LockResource(LoadResource(m_hMod,m_hRsrc));
    m_nSize = SizeofResource(m_hMod,m_hRsrc);
}




--------------------
...
PM   Вверх
AndreySol
Дата 15.7.2005, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это я все знаю, вопрос в том что полученное имя ресурса не удается применить для его загрузки.
Прикрепляю архив тестовой проги (сделана на VC++ 6.0 + SP6) посмотрите пожалуйста, что же в ней не так. Там по мессагам видно, что ресурс найден, потом загружен а все равно не возможно использовать имя для чего-то полезного.
И еще проверьте плиз, правильно ли я перевел обозначения типов ресурсов ?

Присоединённый файл ( Кол-во скачиваний: 20 )
Присоединённый файл  ResView.rar 23,18 Kb
PM MAIL   Вверх
Earnest
Дата 15.7.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В общем, подробно я не разбиралась,
но иконки, определенные в модуле, у тебя грузятся в раздел "Аппаратно-независимые", но там ты их не пытаешься загружать. А разделе просто "иконки" - фиг знает что. Если там, где вызывается LoadIcon, написать (ручками) правильное имя иконки, то все грузится. Для проверки открой какой-нибудь exe в студии как ресурсы и для сравнения у себя в программе. Сразу увидишь разницу.

Но это не все. Вот этот вызов - просто чушь

Код

        EnumResourceTypes(hExe, (ENUMRESTYPEPROC)EnumTypesFunc(hExe, RT_ICON, (DWORD)this), 0);


Ты должен передать в EnumResurseTypes указатель на функцию, а передаешь BOOL, нагло к нему преобразованный - как еще не валится, непонятно. Фактически, все твои вызовы EnumResourseTypes просто ничего не делают. Да и не нужны они тебе - ты ведь просто руками все типы перебираешь.




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


Опытный
**


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

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



Цитата

Ты должен передать в EnumResurseTypes указатель на функцию, а передаешь BOOL, нагло к нему преобразованный - как еще не валится, непонятно. Фактически, все твои вызовы EnumResourseTypes просто ничего не делают. Да и не нужны они тебе - ты ведь просто руками все типы перебираешь.

Вообщето все взято из MSDN, может это у них там все - "нагло к нему преобразованный - как еще не валится, непонятно...". А насчет "Фактически, все твои вызовы EnumResourseTypes просто ничего не делают" - а что же тогда дерево заполняет - святой дух что ли ?
И вообще не ответ это, помогли бы лучше как правильно надо исправить чтоб заработало, а обхаять - большого ума не надо.
PM MAIL   Вверх
Earnest
Дата 19.7.2005, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вместо того, чтобы обижаться, ты бы лучше подумал и внимательно прочитал ответ: там все есть.
Цитата(AndreySol @ 18.7.2005, 05:05)
а что же тогда дерево заполняет - святой дух что ли ?

Вызовы EnumTypesFunc и заполняют. Но только прямые, а не обратные, как предполагается в ф-и EnumResourceTypes. Еще раз повторю, вместо адреса функции типа EnumTypesFunc, ты передаешь результат ее выполнения (BOOL). И что ты этим хотел сказать? Функцию перебора типов ресурсов вообще надо вызывать один раз, причем вот так:
Код

EnumResourceTypes(hExe, (ENUMRESTYPEPROC)EnumTypesFunc,(DWORD)this);








--------------------
...
PM   Вверх
AndreySol
Дата 20.7.2005, 06:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ну вообще-то я такой вариант ф-ции взял не с потолка, а из MSDN - или там неправы ?
По мессагам видно, что ресурс загружается и блокируется - значит имена все же правильные, почему тогда не удается загрузить через LoadIcon ?

Это сообщение отредактировал(а) AndreySol - 20.7.2005, 06:53
PM MAIL   Вверх
Earnest
Дата 20.7.2005, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Потому что LoadIcon загружает аппаратно независимые иконы, они находятся в другом разделе (RC_GROUP_ICON), а не в RC_ICON. Последнее - аппаратно-зависимые иконы, которые неведомо откуда берутся. Т.е. я загузила свое приложение, в котором точно нет никаких RC_ICON. А в списке ресурсов они есть - может, они по умолчанию всегда добавляются.
Что касается примера из MSDN, то не знаю, где вы это нашли. Да и в любом случае, его тоже люди пишут, могут и ошибиться. Думать нужно в любом случае.

Это сообщение отредактировал(а) Earnest - 20.7.2005, 16:27


--------------------
...
PM   Вверх
AndreySol
Дата 25.7.2005, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выдержка из MSDN:
Цитата

The EnumResourceTypes function searches a module for resources and passes each resource type it finds to an application-defined callback function.
....
BOOL EnumResourceTypes(
    HMODULE hModule,
    ENUMRESTYPEPROC lpEnumFunc,
    LONG_PTR lParam
);

The EnumResTypeProc function is an application-defined callback function used with the EnumResourceTypes function.
.....
BOOL CALLBACK EnumResTypeProc(
    HMODULE hModule,
    LPTSTR lpszType,
    LONG_PTR lParam
);

А нашел в статье "Using Resources".

Это сообщение отредактировал(а) AndreySol - 25.7.2005, 06:34
PM MAIL   Вверх
Earnest
Дата 25.7.2005, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



И как из этой цитаты следует код, который ты написал?
Вот твой код:
Код

       EnumResourceTypes(hExe, (ENUMRESTYPEPROC)EnumTypesFunc(hExe, RT_ICON, (DWORD)this), 0);


Еще раз повторяю: это НЕПРАВИЛЬНО!!!
В этой строке ты ВЫЗЫВАЕШЬ функцию, вместо того, чтобы передать ее АДРЕС.




--------------------
...
PM   Вверх
AndreySol
Дата 26.7.2005, 06:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это из той же статьи из MSDN:
Код

EnumResourceTypes(hExe,              // module handle 
    (ENUMRESTYPEPROC)EnumTypesFunc,  // callback function 
    0);


PM MAIL   Вверх
Earnest
Дата 26.7.2005, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



AndreySol smile smile smile
Это что, по твоему, одно и тоже?

Код

EnumResourceTypes(hExe,              // module handle 
    (ENUMRESTYPEPROC)EnumTypesFunc,  // callback function 
    0);

и
Код

   EnumResourceTypes(hExe, 
      (ENUMRESTYPEPROC)EnumTypesFunc(hExe, RT_ICON, (DWORD)this), 
0);


Если ты работаешь программистом, сообщи адрес своего работодателя, напишу ему, чтобы немедленно тебя уволил. smile


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


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 11.5.2012
Где: г. Одесса

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



Привет всем!!! Вот у меня такая проблема я пишу в среде DEV-C++ и у меня такая ошибка линковщика происходит от фунции EnumResourceNames(dll, RT_ICON, (ENUMRESNAMEPROC) EnumResNameProc, 0);
а вот что пишет DEV-C++:
[Linker error] undefined reference to `_Z15EnumResNameProcPvPKcPcl@16'
Кто подскажет в чём может быть проблема??? Заранее спасиба...
PM MAIL   Вверх
Earnest
Дата 11.5.2012, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Pro100XAKEP, создай новую тему, и не здесь, а в WinAPI.


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


 




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


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

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