Запуск процедуры по адресу

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Гость

Сообщение Гость »

Коллеги, вот такая еще проблемка (уж не обессудьте за частые и, может, глупые вопросы).
Работаю с внешней DLL (написана на ассемблере).
Эта внешняя DLL мониторит наличие подключения некоего устройства, сидящего на USB-шине (впрочем, жти подробности не важны).
Ну вот. И в случае обрыва подключения она должна запускать в моей программе некую процедуру (ну, например, выдавать на экран окно с чем-то там).
Разработчик той DLL указал такое описание функции:
InitProc(StatusProc)
StatusProc - указатель на процедуру, которая будет вызвана при потере соединения.
Процедура StatusProc вызывается DLL-библиотекой с одним параметром: 1 - если подключение имеется, 0 - если подключение потеряно.
Я (пока только в целях отладки) попробовал запустить эту внешнюю функцию вот таким манером:

Код: Выделить всё

ret#=InitProc(ADDRESS(MyProc))
Но при таком вызове моментально сваливается вся моя программа.
Написал: Booroondook(77)
Гость

Сообщение Гость »

1. Как описано InitProc? Возможно, опущен атрибут DLL

Код: Выделить всё

  Module('Lib.Dll')
    StatusProcType(Long),Type
    InitProc(StatusProcType),Dll
  End

  ...
  InitProc(MyProc)
А если хочется вызывать по адресу, тогда так

Код: Выделить всё

  Module('Lib.Dll')
    StatusProcType(Long),Type
    InitProc(StatusProcType),Dll,Name('InitProc')
    InitProcAddr(Unsigned Addr),Dll,Name('InitProc')
  End

  InitProc(Address(MyProc))
Но это НЕ РАБОТАЕТ, если MyProc находится во внешнем DLL. И ещё раз проверь наличие атрибута DLL в описании InitProc

Автору: Не пора ли подписаться на Clalist?

--
C уважением
Yuri
Адрес:yufil@mail.ru


(Добавление)

Процедура StatusProc, насколько я понял, написана тобой на Кларионе? Если так, то:

1 - какая сборка приложения (один EXE-файл, DLL-либы), и если DLL-сборка, то где находится StatusProc?

2 - по-умолчанию, параметры в Кларион-процедуры передаются через регистры (строки - через внутренний строковый стек), а внешняя либа, скорее всего, требует стандартной передачи параметров - через стек. В этом случае, естественно, после вызова StatusProc произойдет неверное смещение указателя стека, что и может привести немедленно или позже к GPF.
Поэтому прототип своей процедуры необходимо описать так:

MyProc(LONG _Code),C или PASCAL

Что именно (C или PASCAL) необходимо узнать у разработчика внешней либы. Для Виндов, вообще-то, стандартом является PASCAL-протокол передачи параметров.

Удачи!

=============================
С уважением, Олег А. Руденко.
Oleg_Rudenko@mail.ru
Oleg_Rudenko@mail333.com
Библиотека DynaLib
http://dynalib.narod.ru

Написал: ClaList(2)
Гость

Сообщение Гость »

Спасибо за советы.
Буду пробовать.

На форум подписался!
Правда, под своим настоящим именем (а не этим ником).
Написал: Booroondook(77)
Ответить