Страница: 1 |
Известно, что можно написать Callback функцию и передать её адрес для вызова в dll. Возможно ли на VB6 решить обратную задачу: выполнить Callback функцию, написанную на VB6, получив её адрес?
Ну пишешь функцию в модуле, затем передаёшь её адрес в dll (AddressOf). Оттуда её будут вызывать Неужели никто не знает?? Да вроде также как и для внешних библиотек. Только твоя калбак функция должна сама что то делать, да ещё и значение возвращать. 2 <=Alex=> 2 Павел: MSDN: Passing Function Pointers to DLL Procedures and Type Libraries. --Нашёл в нём подобные функции CallbackNN Но ведь нет функции Callback4 в kernel32 ?? а функция #4 -> AddConsoleAliasW Объясни, плиз P.S. Я написал пример dll на с, вызывающий мою функцию из ВБ: int _stdcall ExecuteCallback(int Address, int v) { typedef __declspec(dllimport) void CallBackFunctionType(int v); CallBackFunctionType *CallBackFunction; CallBackFunction=(CallBackFunctionType *)Address; CallBackFunction(v); return 0; } Private Declare Function ExecFunction Lib "CallbackExecution.dll" Alias "ExecuteCallback" (ByVal Address As Long, ByVal v As Long) As Long Public Sub CallbackF1(ByVal v As Long) MsgBox CStr(v * 10) End Sub Private Sub Command1_Click() MsgBox ExecFunction(GetAddress(AddressOf CallbackF1), 3) End Sub Но это не решит проблемы, не писать же по одной dll для каждого случая?? Да и после выполнения она что-то умирает... Ну раз ты знаешь что такое калбак на ЦеПэПэ, то осталось только обратить внимание на написаное павлом. Public Function add_AdrProc(ByVal AddressOff_ProcName& As Long Ты должен вызывать addresof именно этой(или подобной) функции. addresof add_AdrProc. 2 CyRax: То есть, предлашаешь инструкцию вида: ExecFunction(addressof GetAddress( addressof CallbackF1)) , где Public Function GetAddress(ByVal AddressOff_ProcName As Long) As Long add_GetAddress = AddressOff_ProcName End Function ?? У меня среда сразу умирает, когда пишу такое. Причём в момент проверки синтаксиса... Ладно, спасибо всем, видимо придётся отложить в долгий ящик и использовать вместо этого объявленный интерфейс. Что плохо, так как придётся помнить про удаление ссылки на вызываемый объект. 2 Admin: Есть предложение: может стоит сделать сортировку вопросов не по дате создания ветки, а по дате последнего ответа? Так удобнее искать горячие темы. А в самом верху показывать свои вопросы (по логину)? 2Павел Sorry 2 Swift. Отсылаю тебя к моему примеру ARPad. Посмотри ссылку на первой странице. RichAPI называется. Там функции чтения и записи файлов реализованы через калбак ф-ии (StreamFileIn и StreamFileOut). Если что не поймёшь - мыль. посмотрел пример, спасибо. да, всё так как я писал. Работает, но не долго Страница: 1 |
Вопрос: Выполнить Callback функцию
Добавлено: 04.12.03 11:07
Автор вопроса: Swift
Ответы
Всего ответов: 14
Номер ответа: 1
Автор ответа:
Александр
Разработчик Offline Client
ICQ: 204034
Вопросов: 106
Ответов: 1919
Профиль | | #1
Добавлено: 04.12.03 20:34
А как написать CallBack???
Номер ответа: 2
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #2
Добавлено: 05.12.03 18:34
Номер ответа: 3
Автор ответа:
shuffle
Администратор
ICQ: 201502381
Вопросов: 15
Ответов: 737
Профиль | | #3
Добавлено: 06.12.03 05:14
Когда-то я пытался такое сотворить... Но ничего не получилось... VB вообще не умеет работать с указателями...
Номер ответа: 4
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #4
Добавлено: 06.12.03 06:37
для примера посмотри открытие и сохранение файла в моём ArPad'е.
Номер ответа: 5
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #5
Добавлено: 06.12.03 12:31
А что такое CallBack, простите за тупой вопрос..
Вот это не оно?
-----------------------
...
Нашёл в нём подобные функции CallbackNN (их там много и пронумерованы от 0 до 64, кратные 4)
Номер означает, номер в передаваемых параметрах, по которому будет
осуществлятся переход (именно переход - JMP, а после него RET)
В ВинАпи32 про них ни гу-гу... и ещё много про чего ни-ни....
Тут же засунул их (четыре первых) в проект.
и именно Callback4 подошла.
Получился полноценный вызов подрпрограммы (функции) по адресу в переменной типа Long.
'------------------------------------------------------------------------------------------
Public Declare Sub dll_Callback4 Lib "kernel32" Alias "Callback4" (ByVal Val_Long As Long)
или универсальный способ
Public Declare Function dll_Callback4 Lib "kernel32" Alias "Callback4" (ByVal Val_Long As Long) As Long
'------------------------------------------------------------------------------------------
Подпрограмма/функция add_Proba1 объявлена как Public в любом модуле.
Подпрограмма для определения адреса подпрограммы.
Public Function add_AdrProc(ByVal AddressOff_ProcName& As Long
add_AdrProc = AddressOff_ProcName
End Function
...
----------------------------
Номер ответа: 6
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #6
Добавлено: 06.12.03 14:27
Номер ответа: 7
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #7
Добавлено: 06.12.03 14:50
Это вообще инфа о CallBack4 не моя.
Все вопросы к Andr <AndreyYalta@yandex.ru>.
Номер ответа: 8
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #8
Добавлено: 07.12.03 07:50
add_AdrProc = AddressOff_ProcName
End Function
Номер ответа: 9
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #9
Добавлено: 08.12.03 14:39
Номер ответа: 10
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #10
Добавлено: 08.12.03 14:52
Номер ответа: 11
Автор ответа:
Павел
Администратор
ICQ: 326066673
Вопросов: 368
Ответов: 5968
Web-сайт:
Профиль | | #11
Добавлено: 08.12.03 15:45
Swift, зайди в настройки профиля и посмотри там повнимательнее..
Номер ответа: 12
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #12
Добавлено: 09.12.03 10:31
Номер ответа: 13
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #13
Добавлено: 10.12.03 04:51
Номер ответа: 14
Автор ответа:
Swift
Вопросов: 5
Ответов: 43
Профиль | | #14
Добавлено: 10.12.03 14:33