Код (Text): .386 .model flat, STDCALL extrn GetStdHandle:PROC extrn FreeConsole:PROC extrn AllocConsole:PROC extrn ReadConsoleA:PROC extrn ExitProcess:PROC .data num1 dd 0 mess dd 80 buf_v db 80 dup (0) .code start: call FreeConsole call AllocConsole push -10 call GetStdHandle push 0 push offset num1 push mess push offset buf_v push eax call ReadConsoleA push 0 call ExitProcess end start Данный код на стадии линковки выдаёт ошибки unresolved external symbol для каждой функции (подписывая к ним подчёркивание, _ExitProcess например) Что не так ? Меня интересует пример именно в таком виде, применение invoke, includelib с include мне известно, интересен момент запуска кода в таком варианте. Поискал по форуму, не нашёл ничего толкового по extrn. Буду признателен за вашу помощь.
C0deCreat0r раз ты объявил что extrn GetStdHandle:PROC то в каком-то модуле его надо реализовать линкер эту реализацию не находит, и выдает ошибку
Все функции принадлежат kernel32. Не понятно для чего преподаватель дал пример с extrn, когда можно подключить библиотеку kernel32.lib и прописать прототипы функций. В чём прелесть директивы ? если можно так выразится.
GoldFish Я перед тем как задавать вопрос конечно попытался покумекать. В inc прописаны прототипы и константы, ExitProcess PROTO WORD например. Или это одно и тоже ? В книге Пирогова вообще таким образом Код (Text): EXTERN ExitProcess@4:NEAR прописано, но используется includelib. Это понятно примерно как работает, а в этом примере только указаны внешние функции и всё. Что это даёт.
Открыл либу kernel32.lib, посмотрел имена функций, подставил Код (Text): .386 .model flat, STDCALL option casemap:none extrn GetStdHandle@4:PROC extrn FreeConsole@0:PROC extrn AllocConsole@0:PROC extrn ReadConsoleA@20:PROC extrn ExitProcess@4:PROC includelib kernel32.lib .data num1 dd 0 mess dd 80 buf_v db 80 dup (0) .code start: call FreeConsole@0 call AllocConsole@0 push -10 call GetStdHandle@4 push 0 push offset num1 push mess push offset buf_v push eax call ReadConsoleA@20 push 0 call ExitProcess@4 end start Работает. Могу только предположить одно. Данный пример был немного мной отредактирован, в оригинале был инклюд на файл wincon32.inc Предпологаю что в этом файле были следующие строки: Код (Text): ReadConsoleA equ ReadConsoleA@20 и т.д. includelib kernel32.lib Если так, тогда всё понятно. extrn используется в связке с статическими библиотеками и хочешь не хочешь их надо подключать. Такой вывод я сделал, спасибо откликнувшимся !