format PE DLL
include "win32wxp.inc"
include "encoding\utf8ru.inc"
section ".data" data readable writable
instance dd ?
debug_wnd dd ?
msg TCHAR "Привет!",0
section ".code" code readable executable
proc Init stdcall
invoke GetModuleHandle,NULL
mov [instance], eax
invoke MessageBox,0,msg,0,0
ret
endp
section ".idata" import readable writable
library kernel32,"KERNEL32.DLL",\
user32,"USER32.DLL"
include "api\kernel32.inc"
include "api\user32.inc"
section ".edata" export readable writable
export "KEYDLL.DLL",\
Init,"Init"
Не работает DLL
Код:
Код вызывающего приложения:
Код:
format PE GUI 4.0
include "win32wxp.inc"
entry start
section ".code" code readable executable
start:
invoke Init
invoke ExitProcess,0
section ".idata" import readable writable
library kernel32,"KERNEL32.DLL",\
keydll,"KEYDLL.DLL"
import kernel32,\
ExitProcess,"ExitProcess"
import keydll,\
Init,"Init"
include "win32wxp.inc"
entry start
section ".code" code readable executable
start:
invoke Init
invoke ExitProcess,0
section ".idata" import readable writable
library kernel32,"KERNEL32.DLL",\
keydll,"KEYDLL.DLL"
import kernel32,\
ExitProcess,"ExitProcess"
import keydll,\
Init,"Init"
Приложение вызывает функцию Init из DLL, которая в свою очередь должна выводить сообщение с помощью MessageBox. Это как должно быть, а на деле появляется окно "Обнаружена ошибка". Оно появляется только если процедура Init обращается к методам API. Если процедура этого не делает ошибки не происходит. Что не так?
Во-первых,проверьте имя экспортируемой функции в уже скомпилированной DLL(я так полагаю,export "KEYDLL.DLL",Init,"Init" однозначно задаёт имя,но всё же…)(1)
Далее:FASM понимает,что надо вызвать MessageBoxW?(2)
Попробуйте Invoke Init заменить на Call Init(если FASM этого не запрещает).Ну это так,для острастки (=
Цитата: KIV
Это как должно быть, а на деле появляется окно "Обнаружена ошибка". Оно появляется только если процедура Init обращается к методам API. Если процедура этого не делает ошибки не происходит
Что ещё за окно такое?Если оно специфично для отладчика,укажите его
И процедура Init как раз-таки обращается к [COLOR="Silver"]методам[/COLOR] функциям API…или я вас не понимаю:confused:
FASM прекрасно понимает, что надо вызывать MessageBoxW.
Call Init - не подойдет. Тут нужен косвенный вызов, а call вызовет не функцию, а ячейку памяти в которой хранится её адрес.
Окно "Обнаружена ошибка" - стандартное окно Windows, ни к каким отладчикам отношения не имеет. Там еще предлагается отправить отчет Microsoft. Оно появляется когда приложение выполняет недопустимую операцию.
Цитата:
И процедура Init как раз-таки обращается к методам функциям API…или я вас не понимаю
Если я оставляю Init пустой, то ошибка не возникает. Ну а если Init пытается вызвать MessagBox или GetModuleHandle, то приложение рушится...
Возможно,у вас ошибка в Invoke MessageBox,0,msg,0,0–где-то тут(возможно,в выделенном) надо указать,что требуется адрес,а не значения.Ну ты понел
Неплохо бы привести,в каком модуле возникает ошибка,по каким координатам…Или вообще,воспользоваться отладчиком и не удивляться,чегойта ошибка вылазит
Отсутствует DllEntryPoint.
Дык она вроде необязательна.Например,на MAsm это делается ключом /NoEntry при компиляции.К тому же,он написал,что ошибка возникает только при вызове API-функций
Из того что Windows сказал по этому поводу ошибка происходит как раз в этой библиотеке, т. е. на функцию API не передается управление (если бы ошибка произошла при выходе из неё сообщение все же отобразилось).
Цитата:
Или вообще,воспользоваться отладчиком и не удивляться,чегойта ошибка вылазит
Можете посоветовать какой-нибудь отладчик для Windows?
Код:
section '.reloc' fixups data discardable
в конец библиотеки.
Так было в примере библиотеки, идущем вместе с FASM.
А зачем нужна эта секция?
Просто я в другом примере тоже увидел эту секцию.А нужна она для тогочтобы при перемещении модуля относительно базового адреса загрузки(если там уже другой модуль) остались верными адреса переменных,функций и т.п.
Такие дела.Читайте про PE (=