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

Discussion in 'WASM.WIN32' started by Lex2029, Nov 15, 2007.

  1. Lex2029

    Lex2029 New Member

    Blog Posts:
    0
    Joined:
    Sep 17, 2007
    Messages:
    199
    Подскажите как получить модуль, например, kernel32.dll?

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

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

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

    asd New Member

    Blog Posts:
    0
    Joined:
    Mar 12, 2005
    Messages:
    952
    Location:
    Russia
    Lex2029
    Не может быть. если не возвращает что необходимо, то надо смотреть, что за ошибка(GetLastError), потом лезть в msdn и смотреть, что эта ошибка означает.
     
  3. Booster

    Booster New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    Lex2029
    А целиком пример можешь привести? По идее надо GetModuleHandleA. Ещё интересно что GetLastError врзвращает?
     
  4. Lex2029

    Lex2029 New Member

    Blog Posts:
    0
    Joined:
    Sep 17, 2007
    Messages:
    199
    А это и есть целый пример :)
    GetLastError возвращает 126
    Пипец не понимаю :dntknw:
     
  5. Booster

    Booster New Member

    Blog Posts:
    0
    Joined:
    Nov 26, 2004
    Messages:
    4,860
    Lex2029
    The specified module could not be found.
    Может ты юникод версию юзаешь?
    GetModuleHandleW GetModuleHandle
    Попробуй явно GetModuleHandleA.
     
  6. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    szDllName db 'kernel32.dll',0
    хорош гадать :)
     
  7. rmn

    rmn Well-Known Member

    Blog Posts:
    0
    Joined:
    Nov 23, 2004
    Messages:
    2,347
    нет. Целый пример - это фрагмент исходника, который ты компилируешь. Переписывая две строчки на форум ты вполне мог исправить ошибку в коде :)

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

    Lex2029 New Member

    Blog Posts:
    0
    Joined:
    Sep 17, 2007
    Messages:
    199
    Code (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

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    Имя другой библиотеки подставлял?
     
  10. Lex2029

    Lex2029 New Member

    Blog Posts:
    0
    Joined:
    Sep 17, 2007
    Messages:
    199
    Подставлял даже своей собственной, которая в той же папки лежит!
     
  11. Lex2029

    Lex2029 New Member

    Blog Posts:
    0
    Joined:
    Sep 17, 2007
    Messages:
    199
    Блин!!! Я ничего не понимаю :dntknw:(( Запустил через отладчик и все заработало!! Теперь и без отладчика! Я исходник даже не открывал! что за тупость...
     
  12. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    Бинарник выкладывай.
     
  13. Freeman

    Freeman New Member

    Blog Posts:
    0
    Joined:
    Feb 10, 2005
    Messages:
    1,385
    Location:
    Ukraine
    мистика, волшебный отладчик :)
     
  14. EvilsInterrupt

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

    Blog Posts:
    0
    Joined:
    Oct 28, 2003
    Messages:
    2,428
    Location:
    Russia
    Рекомендую посмотреть в сторону ф-ции SystemErrorMessage(так вроде) смысл ее вернуть текст ошибки, а уж его прочитать то не сложно ;)
     
  15. twgt

    twgt New Member

    Blog Posts:
    0
    Joined:
    Jan 15, 2007
    Messages:
    1,494
    #define ERROR_MOD_NOT_FOUND 126L
    The specified module could not be found.
     
  16. Lex2029

    Lex2029 New Member

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

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

    Blog Posts:
    0
    Joined:
    Oct 28, 2003
    Messages:
    2,428
    Location:
    Russia
    Lex2029
    Ну найди его сам, этот адрес загрузки, за одно PE-формат изучишь, что очень будет полезно на будущее )

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

    Lex2029 New Member

    Blog Posts:
    0
    Joined:
    Sep 17, 2007
    Messages:
    199
    А как связана GetModuleHandle и формат исполняемых файлов?
    А на счет второго вопроса, я не понял :) В чем вопрос? :)
     
  19. twgt

    twgt New Member

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

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

    Blog Posts:
    0
    Joined:
    Oct 28, 2003
    Messages:
    2,428
    Location:
    Russia
    twgt
    ГЫ ))) Отжег ;)

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

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