Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перечисление имен ресурсов, работает не корректно 
V
    Опции темы
deniska
Дата 9.9.2008, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

FILE* file;
BOOL WINAPI EnumNamesFunc(HMODULE hModule, LPCTSTR lpType,LPTSTR lpName,LONG lParam)
{
    char buffer[100];
    if ((ULONG)lpName & 0xFFFF0000)     
    { 
        sprintf(buffer,"%s\n", lpName);  
    }     
    else 
    { 
        sprintf(buffer, "%u\n",(USHORT)lpName);     
    } 
    fprintf( file, "Name Res  %s\n", buffer );
    return true;
}

BOOL WINAPI EnumTypesFunc(HMODULE hModule,LPTSTR lpType, LONG lParam)
{
    char buffer[100];
    if ((ULONG)lpType & 0xFFFF0000)     
    { 
        sprintf(buffer, "%s\n", lpType);     
    }     
    else 
    {         
        sprintf(buffer, "%u\n", (USHORT)lpType);     
    }  
    fprintf( file, "Type %s\n", buffer );
    EnumResourceNames(hModule,lpType,(ENUMRESNAMEPROC)EnumNamesFunc,lParam); 
    return true;
}


Код


    hModule = LoadLibrary( FilePath );
    if( hModule != NULL )
    {
        file = fopen( "res.txt", "w" );
        EnumResourceTypes(hModule,(ENUMRESTYPEPROC)EnumTypesFunc, 0 );
        fclose( file );

        FreeLibrary( hModule );
    }

пытаюсь в текстовый файл писАть тип ресурса и имена ресурсов данного типа. в итоге получается не полный список.
почемуто имена ресурсов RT_BITMAP перечисляются вроде все(на глаз), а вот по типу RT_STRING перечисляется полная чушь, хотя их должно быть около 200 штук а в итоге НИ ОДНОГО верного имени в файл не попадает. 
если вручную написать LoadString  с определенным идентификатором, то строка считывается нормально, то есть она там реально есть.
Не работает именно перечисление строк. У String table в ресурсах язык стоит "Русский". 
Смущает то что идентификаторы строк и картинок BMP в большинстве своем пересекаются (так сгенерировал студийный wizard) в dll-ке.
Проект загружаемой Resource dll имеется. 

отчего такой косяк с перечислением строк???

Это сообщение отредактировал(а) deniska - 9.9.2008, 09:34
PM MAIL ICQ   Вверх
deniska
Дата 9.9.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну что? есть идеи какие? или можно идти стреляться  smile 
PM MAIL ICQ   Вверх
HappyLife
Дата 9.9.2008, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А что это?
Код

if ((ULONG)lpType & 0xFFFF0000) 

PM MAIL   Вверх
deniska
Дата 9.9.2008, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



проверяем в каком виде имя(тип) пришло: строкой или числовым идентификатором то же что макрос IS_INTRESOURCE
PM MAIL ICQ   Вверх
GremlinProg
Дата 9.9.2008, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



каждый ресурс STRINGTABLE (RT_STRING) может включать вплоть до 16 строк, идентификатор любой строки шифруется так:

ID/16+1 - это идентификатор ресурса RT_STRING

сам ресурс - последовательный набор из 16-ти позиций
каждая содержит 2 поля:
1. длина строки (2 байта)
2. сама строка в размере первого поля (строка в юникоде и без терминатора!) 

индекс номера строки берется так же из идентификатора: ID%16

поэтому число ресурсов RT_STRING не обязательно должно быть равным числу строк,
стандартно, делим число строк на 16 + остаток - получим реальное число русурсов RT_STRING


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
deniska
Дата 9.9.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GremlinProg, не втыкаю.
вот какие ID получаются при моем считывании:
Цитата

Type 6(тип строка)
дальше идут ID

Name Res  63

Name Res  64

Name Res  65

Name Res  66

Name Res  67

Name Res  68

Name Res  69

Name Res  70

Name Res  71

Name Res  72

Name Res  73

Name Res  3841

Name Res  3842

Name Res  3843

Name Res  3857

Name Res  3858

Name Res  3859

Name Res  3860

Name Res  3865

Name Res  3866

Name Res  3867

Name Res  3868

Name Res  3869

Name Res  3887



реально я знаю что ид. строк у меня лежат в диапазоне 1000 - 1150 (те которые я туда вносил).
вот чего то как то одно из другого не получается...
PM MAIL ICQ   Вверх
GremlinProg
Дата 9.9.2008, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



ну вот
63 => 63 * 16 = 1008
73 => 73 * 16 = 1168
т.е. ресурсы с 63 по 73 полностью покрывают все твои строки

остальные - левые, разбирай код, индексы на три халфбайта )
или напутал чего, или это недекодированные индексы строк


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 9.9.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



в принципе, это мугут быть так же ресурсы, но скомпилировванные по-умолчанию (самой средой или в частном порядке),
посмотри, что там внутри

вот загрузчик строк:
Код

std::wstring wcsload(HINSTANCE hInstance,int ID,LCID lcid){
    std::wstring retval;
    HRSRC hrsrc        = ::FindResourceEx(hInstance,RT_STRING,MAKEINTRESOURCE(ID/16+1),LANGIDFROMLCID(lcid));
    HGLOBAL hmem    = ::LoadResource(hInstance,hrsrc);
    LPCWSTR array    = (LPCWSTR)::LockResource(hmem);
    for(int id = 0;id<16;id++){
        if(id == ID%16){
            if(*array){
                retval.resize(*array);
                ::wcsncpy(&(*retval.begin()),array + 1,*array);
            }
            break;
        }
        array    += (*array + 1);
    }
    ::FreeResource(hmem);
    return retval;
}

для STRINGTABLE - по аналогии:
Код

std::wstring wcstload(HINSTANCE hInstance,int ID,LCID lcid){
    std::wstring b,retval;
    HRSRC hrsrc        = ::FindResourceEx(hInstance,RT_STRING,ID,LANGIDFROMLCID(lcid));
    HGLOBAL hmem    = ::LoadResource(hInstance,hrsrc);
    LPCWSTR array    = (LPCWSTR)::LockResource(hmem);
    for(int id = 0;id<16;id++){
            if(*array){
                b.resize(*array);
                ::wcsncpy(&(*b.begin()),array + 1,*array);
                retval    += b;
                retval    += L"\r\n";
            }
        array    += (*array + 1);
    }
    ::FreeResource(hmem);
    return retval;
}


Это сообщение отредактировал(а) GremlinProg - 9.9.2008, 15:51


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
deniska
Дата 9.9.2008, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спс огромный. завтра буду пробовать. даже не знал про такую организацию строк...

Это сообщение отредактировал(а) deniska - 10.9.2008, 09:55
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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