Здравствуйте! Помогите разобраться, а то че то до самого не доходит! =) Я написал прогу, которая выводит MessageBox и завершается с помощью ExitProcess. Но в таблице импорта этой проги почему -то присутствует функция wsprintfA?! Вот исходник: Код (Text): .386 .model flat, stdcall option casemap :none include \MASM32\INCLUDE\windows.inc include \MASM32\INCLUDE\kernel32.inc include \MASM32\INCLUDE\shell32.inc include \MASM32\INCLUDE\masm32.inc include \MASM32\INCLUDE\user32.inc includelib \MASM32\LIB\kernel32.lib includelib \MASM32\LIB\shell32.lib includelib \MASM32\LIB\masm32.lib includelib \MASM32\LIB\user32.lib ; ######################################################################### .data Msg db "It's my first program with Assembler!",0 T db "Asm is a great language!",0 .code start: invoke MessageBoxA,NULL,addr Msg,addr T,NULL invoke ExitProcess,NULL end start ; #########################################################################
В windows.inc есть такие строчки: wsprintfA PROTO C WORD,:VARARG wsprintf equ <wsprintfA> В принципе, это не должно влиять на импорт, если функция wsprintf нигде не вызывается. Попробуйте закомментировать эти строчки. Какие ключи используются при линковке?
Да, есть такая багофича. Хотя wsprintf ни разу не используется, но раз она описана в windows.inc, то она линкуется. ИМХО помогает только удаление строки из windows.inc.
Gais Я думаю этого для твоего первого приложения достаточно Код (Text): .386 .model flat, stdcall option casemap :none include \MASM32\INCLUDE\windows.inc includelib \MASM32\LIB\user32.lib ;###################################################################### extern _imp__MessageBoxA@16:dword .data Msg db "It's my first program with Assembler!",0 T db "Asm is a great language!",0 .code start: push NULL push offset T push offset Msg push NULL call _imp__MessageBoxA@16;,NULL,addr Msg,addr T,NULL ret end start и никаких лишних функций в импорте
Mikl__ Да, действительно, в твоей программе будет только MessageBox. А вот если дописать include \MASM32\INCLUDE\user32.inc - происходит какой-то фокус, и в импорте появляется wsprintf. А если теперь закомментировать указанные строки в windows.inc - wsprintf из импорта исчезает. Чудеса Может, это потому что wsprintf дважды объявлена - в windows.inc и user32.inc?
maxdiver Не понимаю, почему Вам инвокабельный вызов так нравится, мало того что код раздувается, еще и непредсказуемые эффекты типа лишних wsprintf http://www.wasm.ru/article.php?article=dznotes
Mikl__ С чего Вы решили, что мне нравится invoke? И лишний импорт появляется и при обычном вызове. Я же говорю, достаточно только добавить include. P.S. ТС - Gais, а не я
maxdiver (offtop) Ни коим образом не хотел Вас/тебя обидеть, просто все примеры для BEGINNERS с invoke но если делать неинвокабельный вызов процедур, никаких инклюдов кроме windows.inc и не требуется
Было уже обсуждение подобного. Масм кладёт ссылку на импортируемый символ при первом использовании его, а линкер создаёт соответствующую запись в таблицу импорта, если этот символ - внешний. Но штука в том, что для масма повторное объявление суть использование ранее объявленного символа и он включает его в объектник. Попробуйте написать "CloseHandle PROTO STDCALL WORD" при включенном kernel32.inc - вы получите эту запись в импорте. Вот и wsprintf реально объявлена два раза: в windows.inc и user32.inc.
Код (Text): ; =========================================== ; user32.inc copyright MASM32 1998 - 2003 ; =========================================== wsprintfA PROTO C :DWORD,:VARARG wsprintfW PROTO C :DWORD,:VARARG ActivateKeyboardLayout PROTO :DWORD,:DWORD ... У меня так.
а у меня так Код (Text): externdef _imp__ActivateKeyboardLayout@8:PTR pr2 ActivateKeyboardLayout equ <_imp__ActivateKeyboardLayout@8> а в windows.inc так Код (Text): ; wsprintfA PROTO C :DWORD,:VARARG ; wsprintf equ <wsprintfA> prvar typedef PROTO C :DWORD,:VARARG externdef _imp__wsprintfA:PTR prvar wsprintf equ <_imp__wsprintfA>
Asterix Ну да, это импорт без переходников, это уже не масм32 Такое у меня тоже есть, только отдельно.
Ага, значит за двойное обьявление wsprintf (как в том анекдоте про панели Нортона надо Хатчу спасибо сказать. Кстати, почему он вообще обьявил wsprintf в windows.inc???
Ты таблицу импорта чем смотрел Soft-Ice'ом чтоли незабывай что на низком уровне все masm32 библиотеки переводятся в API, поэтому при вызове MessageBox функция wsprintf очевидно выводит в твой MessageBox заголовок и текст в окно сообщения,поэтому ничего удивительного, это функция для печати форматной строки, переводится как wsprintf-WindowsStringPrintFormat,не надо путать с WindowsStringPrintFile-печать файла.