Лишняя функция в таблице импорта

Тема в разделе "WASM.RESEARCH", создана пользователем Gais, 12 июн 2007.

  1. Gais

    Gais New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    68
    Здравствуйте! Помогите разобраться, а то че то до самого не доходит! =)
    Я написал прогу, которая выводит MessageBox и завершается с помощью ExitProcess. Но в таблице импорта этой проги почему -то присутствует функция wsprintfA?!
    Вот исходник:
    Код (Text):
    1.     .386
    2.     .model flat, stdcall
    3.     option casemap :none
    4.  
    5.     include \MASM32\INCLUDE\windows.inc
    6.     include \MASM32\INCLUDE\kernel32.inc
    7.     include \MASM32\INCLUDE\shell32.inc
    8.     include \MASM32\INCLUDE\masm32.inc
    9.     include \MASM32\INCLUDE\user32.inc
    10.  
    11.     includelib \MASM32\LIB\kernel32.lib
    12.     includelib \MASM32\LIB\shell32.lib
    13.     includelib \MASM32\LIB\masm32.lib
    14.     includelib \MASM32\LIB\user32.lib
    15.  
    16. ; #########################################################################
    17.  
    18. .data
    19. Msg db "It's my first program with Assembler!",0
    20. T db "Asm is a great language!",0
    21.  
    22. .code
    23.  
    24. start:
    25. invoke MessageBoxA,NULL,addr Msg,addr T,NULL
    26. invoke ExitProcess,NULL
    27.  
    28. end start
    29.  
    30. ; #########################################################################
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    В windows.inc есть такие строчки:
    wsprintfA PROTO C :lol: WORD,:VARARG
    wsprintf equ <wsprintfA>

    В принципе, это не должно влиять на импорт, если функция wsprintf нигде не вызывается. Попробуйте закомментировать эти строчки. Какие ключи используются при линковке?
     
  3. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Да, есть такая багофича. Хотя wsprintf ни разу не используется, но раз она описана в windows.inc, то она линкуется. ИМХО помогает только удаление строки из windows.inc.
     
  4. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    Gais
    Я думаю этого для твоего первого приложения достаточно:)
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3.     option casemap :none
    4.     include \MASM32\INCLUDE\windows.inc
    5.     includelib \MASM32\LIB\user32.lib
    6. ;######################################################################
    7. extern _imp__MessageBoxA@16:dword
    8. .data
    9. Msg db "It's my first program with Assembler!",0
    10. T db "Asm is a great language!",0
    11. .code
    12. start: push NULL
    13.     push offset T
    14.     push offset Msg
    15.     push NULL
    16.     call _imp__MessageBoxA@16;,NULL,addr Msg,addr T,NULL
    17.     ret
    18. end start
    и никаких лишних функций в импорте
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    не замечал
     
  6. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    По-моему, Gais - волшебник, вот и все.

    О windows.inc тоже занятно.
     
  7. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Mikl__
    Да, действительно, в твоей программе будет только MessageBox.

    А вот если дописать include \MASM32\INCLUDE\user32.inc - происходит какой-то фокус, и в импорте появляется wsprintf. А если теперь закомментировать указанные строки в windows.inc - wsprintf из импорта исчезает.
    Чудеса :)

    Может, это потому что wsprintf дважды объявлена - в windows.inc и user32.inc?
     
  8. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    maxdiver
    Не понимаю, почему Вам инвокабельный вызов так нравится, мало того что код раздувается, еще и непредсказуемые эффекты типа лишних wsprintf:dntknw:
    http://www.wasm.ru/article.php?article=dznotes
     
  9. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Mikl__
    С чего Вы решили, что мне нравится invoke?
    И лишний импорт появляется и при обычном вызове. Я же говорю, достаточно только добавить include.
    P.S. ТС - Gais, а не я ;)
     
  10. Mikl_

    Mikl_ New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2006
    Сообщения:
    907
    maxdiver
    (offtop)
    Ни коим образом не хотел Вас/тебя обидеть, просто все примеры для BEGINNERS с invoke :)
    но если делать неинвокабельный вызов процедур, никаких инклюдов кроме windows.inc и не требуется
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Было уже обсуждение подобного.

    Масм кладёт ссылку на импортируемый символ при первом использовании его, а линкер создаёт соответствующую запись в таблицу импорта, если этот символ - внешний. Но штука в том, что для масма повторное объявление суть использование ранее объявленного символа и он включает его в объектник. Попробуйте написать "CloseHandle PROTO STDCALL :lol: WORD" при включенном kernel32.inc - вы получите эту запись в импорте.

    Вот и wsprintf реально объявлена два раза: в windows.inc и user32.inc.
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    в моем user32.inc не объявлена wsprintf )
     
  13. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1.   ; ===========================================
    2.   ; user32.inc copyright MASM32 1998 - 2003
    3.   ; ===========================================
    4.  
    5. wsprintfA PROTO C :DWORD,:VARARG
    6.  
    7. wsprintfW PROTO C :DWORD,:VARARG
    8.  
    9. ActivateKeyboardLayout PROTO :DWORD,:DWORD
    10. ...
    У меня так.
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    а у меня так :)
    Код (Text):
    1. externdef _imp__ActivateKeyboardLayout@8:PTR pr2
    2. ActivateKeyboardLayout equ <_imp__ActivateKeyboardLayout@8>
    а в windows.inc так :)
    Код (Text):
    1. ; wsprintfA PROTO C :DWORD,:VARARG
    2. ; wsprintf equ <wsprintfA>
    3.  
    4. prvar typedef PROTO C :DWORD,:VARARG
    5. externdef _imp__wsprintfA:PTR prvar
    6. wsprintf equ <_imp__wsprintfA>
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Asterix
    Ну да, это импорт без переходников, это уже не масм32 :) Такое у меня тоже есть, только отдельно.
     
  16. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Ага, значит за двойное обьявление wsprintf (как в том анекдоте про панели Нортона :) надо Хатчу спасибо сказать. Кстати, почему он вообще обьявил wsprintf в windows.inc???
     
  17. brat315

    brat315 New Member

    Публикаций:
    0
    Регистрация:
    29 янв 2006
    Сообщения:
    21
    Адрес:
    Russia
    Ты таблицу импорта чем смотрел Soft-Ice'ом чтоли незабывай что на низком уровне все masm32 библиотеки переводятся в API, поэтому при вызове MessageBox функция wsprintf очевидно выводит в твой MessageBox заголовок и текст в окно сообщения,поэтому ничего удивительного, это функция для печати форматной строки, переводится как wsprintf-WindowsStringPrintFormat,не надо путать с WindowsStringPrintFile-печать файла.
     
  18. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    brat315
    :)
     
  19. Gais

    Gais New Member

    Публикаций:
    0
    Регистрация:
    28 мар 2007
    Сообщения:
    68
    Спасибо, братишки!

    kero
    Я не волшебник, я только учусь! =)