Каким должен быть второй параметр FindResource (поиск ресурса)?

Тема в разделе "WASM.BEGINNERS", создана пользователем amvoz, 30 янв 2012.

  1. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Непонятно, логика его присутствия- экзешник- это первый параметр, чё ищем- третий, результат- возаращвемое значение, а второй чё такое?

    ...Но как бы то и был, вообще не понять, в msnd приведён пример где подставляются уже готовые известные числовые значение, а где их брать-то? Так-то я только ищу ресурс и мне про него ничего неизвестно, ни один из идентификторов кроме того, чо он по сути. Ищу иконку экзешника. Спасибо, откликнется

    Код (Text):
    1.  hRes = FindResource((HMODULE)hExe, "хзчёписать", RT_ICON);
    2.  if (hRes == NULL) {
    3.     cout<< "Всё плохо"<< endl;
    4.  }
    И вот ещё , в третий парамет чё писать, RT_GROUP_ICON или RT_ICON?
     
  2. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms648042(v=vs.85).aspx

    Тут же все написано.
     
  3. sysexit

    sysexit New Member

    Публикаций:
    0
    Регистрация:
    27 авг 2010
    Сообщения:
    176
    hRes = FindResource((HMODULE)hExe, MAKEINTRESOURCE(1), RT_ICON);

    Это для получения Raw данных иконки с номером 1.

    RT_GROUP_ICON это хидер для иконок.
     
  4. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну вот опят за рыбу деньги, так мне же неизвестно чё сюда писать
    MAKEINTRESOURCE(сюда)

    Я же говорю- мне ничего неизвестно об иконке кроме того, что она есть. И да, по ссылке я сходил и не только по ней а вот ещё и сюда:

    http://msdn.microsoft.com/en-us/lib...48008(v=vs.85).aspx#_win32_Updating_Resources

    Код (Text):
    1. #define IDD_HAND_ABOUTBOX   103
    2.  
    3. ///Тут всякий разный код
    4.  
    5. hRes = FindResource(hExe, MAKEINTRESOURCE(IDD_HAND_ABOUTBOX), RT_DIALOG);
    6. if (hRes == NULL)
    7. {
    8.     ErrorHandler(TEXT("Could not locate dialog box."));
    9.     return;
    10. }
    Нормально? Это то, о чём я говорю. Челы подставлят известное им числовое значение 103, а где его берут неизвестно и я не вижу честное слово, где бы это было написано
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
  6. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    amvoz
    1) в *.rc файле
    IDD_HAND_ABOUTBOX ICON DISCARDABLE "1.ico"

    2) в коде:
    hRes = FindResource(0, MAKEINTRESOURCE(IDD_HAND_ABOUTBOX), "ICON");
    hResLoad = LoadResource(0, hRes);
    lpStubMapping = LockResource(hResLoad);

    3) в "resource.h"
    #define IDD_HAND_ABOUTBOX 103
     
  7. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Ну да, всё так, вот я перечислил ресурсы некоторого экзешника, где из ресурсов- одна иконка и я их себе переписал:
    Код (Text):
    1. Имя типа в виде числа 3
    2. Имя ресурса в виде числа 1
    3. Имя языка в виде числа 1033
    4.  
    5. Имя типа в виде числа 14
    6. Имя ресурса в виде числа 2373288
    7. Имя языка в виде числа 1033
    А теперь я пишу исходник, который должен эти ресурсы как бы стырить, и вот я тырю сперва один ресурс а потом второй
    Код (Text):
    1. FindResource(0, (чё сюда писать?), (и сюда?));
    Ну я не знаю, у меня ума хватает только на:
    Код (Text):
    1. FindResource((HMODULE)hExe, 1, 3);
    Естественно, компилятор ругается на это.

    +++++++++++++++++++++++++++++++++++++++++++++=

    А если использовать MAKEINTRESOURCEA, как преддложено выше
    Код (Text):
    1. FindResource((HMODULE)hExe, MAKEINTRESOURCEA(1), ??);
    , то я посмотрел чё это за макрос

    Код (Text):
    1. #define MAKEINTRESOURCEA(i) (LPSTR)((DWORD)((WORD)(i)))
    2. #define MAKEINTRESOURCEW(i) (LPWSTR)((DWORD)((WORD)(i)))
    Так он чё, преобразует единицу к указателю на какую-то область памяти (какую-то там строку)????
    (HRSRC FindResource(HMODULE hModule, LPCTSTR lpName,LPCTSTR lpType))
     
  8. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    Да, очевидно ведь.

    О циклах не слышали?

    Если хотите извлечь иконку, то RT_GROUP_ICON это ICO хидер, с одной поправкой заместо raw оффсетов как в файле там имя иконки из группы RT_ICON
     
  9. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    отнюдь, я не просто так спрашиваю:
    Код (Text):
    1.  if (!(hRes = FindResource((HMODULE)hExe, MAKEINTRESOURCEA(1),  MAKEINTRESOURCEA(3)))) {
    2.   cout<< "всё плохо"<< endl;
    3.  };
    4.  getchar ();
    А потом приаттачиваюсь OLLyDbg к процессу и в памяти наблюдаю, что таких адресов-то там в помине нет, ни единицы, ни тройки, там адресация начинается с 10000!
     
  10. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    В чем вопрос-то? Я вас не понимаю? Если offset < 0x10000 то это числовое имя, если больше то это адрес на UNICODE строку. Что тут не понятного?
     
  11. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Меня умные слова офсет, юникод. числовое имя я прочая путают. Программа использует адрес 1, а такого адреса нет! Всё нормально? Вас не смущает? Ну ладно, может кто другой ответит. Как ещё объяснить, я не знаю.
     
  12. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Преобразование к указателю — чисто формальная операция. Чтобы компилятор не ругался. Само числовое значение как было, так и останется единицей (или тройкой), и, естесственно, не станет по волшебству указывать на выделенную память.
    Выделенное жирным неверно. 2373288 = 0x2436A8 > 0xFFFF => ресурс имеет строковое имя (IS_INTRESOURCE вернёт false).
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Всё же правильно?
    Код (Text):
    1.   if ((IS_INTRESOURCE(lpType)))
    2.     printf("Имя ресурса в виде числа %d\n", lpName);    
    3.  else          
    4.     printf("Имя ресурса строчное %s\n", lpName);
    получается большое-большое число
     
  14. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    amvoz
    Разумеется, нет. Тип имени проверяется у типа ресурса, а выводится имя ресурса.
     
  15. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    прошу прощения