Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает DLL

399
21 января 2010 года
KIV
432 / / 20.01.2009
Код библиотеки:
Код:
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"

Код вызывающего приложения:
Код:
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"

Приложение вызывает функцию Init из DLL, которая в свою очередь должна выводить сообщение с помощью MessageBox. Это как должно быть, а на деле появляется окно "Обнаружена ошибка". Оно появляется только если процедура Init обращается к методам API. Если процедура этого не делает ошибки не происходит. Что не так?
7
21 января 2010 года
@pixo $oft
3.4K / / 20.09.2006
FlatAsm не знаю,поэтому буду судить по тому,что понял
Во-первых,проверьте имя экспортируемой функции в уже скомпилированной DLL(я так полагаю,export "KEYDLL.DLL",Init,"Init" однозначно задаёт имя,но всё же…)(1)
Далее:FASM понимает,что надо вызвать MessageBoxW?(2)
Попробуйте Invoke Init заменить на Call Init(если FASM этого не запрещает).Ну это так,для острастки (=
Цитата: KIV
Это как должно быть, а на деле появляется окно "Обнаружена ошибка". Оно появляется только если процедура Init обращается к методам API. Если процедура этого не делает ошибки не происходит

Что ещё за окно такое?Если оно специфично для отладчика,укажите его
И процедура Init как раз-таки обращается к [COLOR="Silver"]методам[/COLOR] функциям API…или я вас не понимаю:confused:

399
21 января 2010 года
KIV
432 / / 20.01.2009
Я пробовал менять имя - если имя не совпадало, то выводилось сообщение "Ошибка при запуске приложения. Не удаётся найти точку входа...".
FASM прекрасно понимает, что надо вызывать MessageBoxW.
Call Init - не подойдет. Тут нужен косвенный вызов, а call вызовет не функцию, а ячейку памяти в которой хранится её адрес.
Окно "Обнаружена ошибка" - стандартное окно Windows, ни к каким отладчикам отношения не имеет. Там еще предлагается отправить отчет Microsoft. Оно появляется когда приложение выполняет недопустимую операцию.
Цитата:
И процедура Init как раз-таки обращается к методам функциям API…или я вас не понимаю


Если я оставляю Init пустой, то ошибка не возникает. Ну а если Init пытается вызвать MessagBox или GetModuleHandle, то приложение рушится...

7
21 января 2010 года
@pixo $oft
3.4K / / 20.09.2006
Ну Call [Init],так,что ли…
Возможно,у вас ошибка в Invoke MessageBox,0,msg,0,0–где-то тут(возможно,в выделенном) надо указать,что требуется адрес,а не значения.Ну ты понел

Неплохо бы привести,в каком модуле возникает ошибка,по каким координатам…Или вообще,воспользоваться отладчиком и не удивляться,чегойта ошибка вылазит
51K
22 января 2010 года
Indian
37 / / 23.12.2009
Отсутствует DllEntryPoint.
http://pblog.ru/?p=538
7
22 января 2010 года
@pixo $oft
3.4K / / 20.09.2006
Дык она вроде необязательна.Например,на MAsm это делается ключом /NoEntry при компиляции.К тому же,он написал,что ошибка возникает только при вызове API-функций
399
22 января 2010 года
KIV
432 / / 20.01.2009
Точка входа не обязательна. Во flat assembler push msg (а ведь invoke это и делает) помещает всегда адрес переменной, для помещения значения нужно написать push [msg].
Из того что Windows сказал по этому поводу ошибка происходит как раз в этой библиотеке, т. е. на функцию API не передается управление (если бы ошибка произошла при выходе из неё сообщение все же отобразилось).
Цитата:
Или вообще,воспользоваться отладчиком и не удивляться,чегойта ошибка вылазит


Можете посоветовать какой-нибудь отладчик для Windows?

399
22 января 2010 года
KIV
432 / / 20.01.2009
Я решил проблему добавлением кода:
 
Код:
section '.reloc' fixups data discardable

в конец библиотеки.
Так было в примере библиотеки, идущем вместе с FASM.
А зачем нужна эта секция?
7
22 января 2010 года
@pixo $oft
3.4K / / 20.09.2006
Кхм,вот ведь хотел написать про релокации…:)
Просто я в другом примере тоже увидел эту секцию.А нужна она для тогочтобы при перемещении модуля относительно базового адреса загрузки(если там уже другой модуль) остались верными адреса переменных,функций и т.п.
Такие дела.Читайте про PE (=
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог