Как работает GetModuleHandle

Тема в разделе "WASM.WIN32", создана пользователем Lex2029, 15 ноя 2007.

  1. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Подскажите как получить модуль, например, kernel32.dll?

    szDllName db 'kernel32',0
    Invoke GetModuleHandle,offset szDllName

    Ничего не возвращает :dntknw:
    .dll тоже подставлял.

    Подскажите плиз
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Lex2029
    Не может быть. если не возвращает что необходимо, то надо смотреть, что за ошибка(GetLastError), потом лезть в msdn и смотреть, что эта ошибка означает.
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Lex2029
    А целиком пример можешь привести? По идее надо GetModuleHandleA. Ещё интересно что GetLastError врзвращает?
     
  4. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    А это и есть целый пример :)
    GetLastError возвращает 126
    Пипец не понимаю :dntknw:
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Lex2029
    The specified module could not be found.
    Может ты юникод версию юзаешь?
    GetModuleHandleW GetModuleHandle
    Попробуй явно GetModuleHandleA.
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    szDllName db 'kernel32.dll',0
    хорош гадать :)
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    нет. Целый пример - это фрагмент исходника, который ты компилируешь. Переписывая две строчки на форум ты вполне мог исправить ошибку в коде :)

    Какие данные объявлены перед szDllName и как используются?
     
  8. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Код (Text):
    1. .data
    2.     szDllName   db 'kernel32.dll',0
    3. .code
    4.  
    5. Start:
    6.     Invoke  GetModuleHandleA,offset szDllName
    7.     .if eax==0
    8.         Invoke  GetLastError
    9.         Invoke  IntToStr,eax
    10.         Invoke  MessageBox,0,eax,0,0
    11.     .endif
    12.     Invoke  MessageBox,0,0,0,0
    13.     Invoke  ExitProcess,0
    14. end Start
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Имя другой библиотеки подставлял?
     
  10. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Подставлял даже своей собственной, которая в той же папки лежит!
     
  11. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Блин!!! Я ничего не понимаю :dntknw:(( Запустил через отладчик и все заработало!! Теперь и без отладчика! Я исходник даже не открывал! что за тупость...
     
  12. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Бинарник выкладывай.
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    мистика, волшебный отладчик :)
     
  14. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Рекомендую посмотреть в сторону ф-ции SystemErrorMessage(так вроде) смысл ее вернуть текст ошибки, а уж его прочитать то не сложно ;)
     
  15. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    #define ERROR_MOD_NOT_FOUND 126L
    The specified module could not be found.
     
  16. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    Да сейчас просто не дома, нет МСДНа...
    Кстати, у меня теперь не получается таким способом получить свою длл, лежит в каталоге с программой.
    В чем дело может быть?
     
  17. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Lex2029
    Ну найди его сам, этот адрес загрузки, за одно PE-формат изучишь, что очень будет полезно на будущее )

    У мну тут мысль закралась, а ты хоть одну ф-цию из dll вызвал? ;)
     
  18. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    А как связана GetModuleHandle и формат исполняемых файлов?
    А на счет второго вопроса, я не понял :) В чем вопрос? :)
     
  19. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    EvilsInterrupt
    A ExitProcess?
    Lex2029
    GetModuleHandle возвращает адрес, по которому модуль загружен(или может быть загружен?!) в память процесса. С форматом PE это связанно как ImageBase.
     
  20. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    twgt
    ГЫ ))) Отжег ;)

    Lex2029
    Дело в том чтобы хэндл был получен,ну чтобы либа была загружена, это можно сделать путем вызова ф-ции в коде и подрубив нужные вещи и тогда линкер построит файл так чтобы в секции импорта была запись о том какая dll и ф-ция из нее нужны. Или же можешь заюзать к примеру LoadLibrary и загрузить динамически т.е. по мере надобности к примеру так делают архитектуры на плагинах, типа взять и подрубить плагин ;)

    twgt
    Если ты поместишь вызов ф-ции какой-либо за вызов ExitProcess, то линкер все равно вставит запись, что ф-ция нужна и следовательно нужна и ее dll тоже ;) Это отчетливо видно чуть ли не в первых примерах от Iczelion`a