Страница: 1 |
Вопрос: Выполнить Callback функцию | Добавлено: 04.12.03 11:07 |
Автор вопроса: ![]() |
Известно, что можно написать Callback функцию и передать её адрес для вызова в dll. Возможно ли на VB6 решить обратную задачу: выполнить Callback функцию, написанную на VB6, получив её адрес? |
Ответы | Всего ответов: 14 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() Разработчик Offline Client ICQ: 204034 Вопросов: 106 Ответов: 1919 |
Профиль | Цитата | #1 | Добавлено: 04.12.03 20:34 |
![]() ![]() |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 43 |
Профиль | Цитата | #2 | Добавлено: 05.12.03 18:34 |
Ну пишешь функцию в модуле, затем передаёшь её адрес в dll (AddressOf). Оттуда её будут вызывать Неужели никто не знает?? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 201502381 Вопросов: 15 Ответов: 737 |
Профиль | Цитата | #3 | Добавлено: 06.12.03 05:14 |
Когда-то я пытался такое сотворить... Но ничего не получилось... VB вообще не умеет работать с указателями... |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 06.12.03 06:37 |
Да вроде также как и для внешних библиотек. Только твоя калбак функция должна сама что то делать, да ещё и значение возвращать. 2 <=Alex=> |
Номер ответа: 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& ![]() add_AdrProc = AddressOff_ProcName End Function ... ---------------------------- |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 43 |
Профиль | Цитата | #6 | Добавлено: 06.12.03 14:27 |
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 для каждого случая?? Да и после выполнения она что-то умирает... |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #7 | Добавлено: 06.12.03 14:50 |
Это вообще инфа о CallBack4 не моя. Все вопросы к Andr <AndreyYalta@yandex.ru>. |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 07.12.03 07:50 |
Ну раз ты знаешь что такое калбак на ЦеПэПэ, то осталось только обратить внимание на написаное павлом. Public Function add_AdrProc(ByVal AddressOff_ProcName& Ты должен вызывать addresof именно этой(или подобной) функции. addresof add_AdrProc. |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 43 |
Профиль | Цитата | #9 | Добавлено: 08.12.03 14:39 |
2 CyRax: То есть, предлашаешь инструкцию вида: ExecFunction(addressof GetAddress( addressof CallbackF1)) , где Public Function GetAddress(ByVal AddressOff_ProcName As Long) As Long add_GetAddress = AddressOff_ProcName End Function ??
Ладно, спасибо всем, видимо придётся отложить в долгий ящик и использовать вместо этого объявленный интерфейс. Что плохо, так как придётся помнить про удаление ссылки на вызываемый объект. |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 43 |
Профиль | Цитата | #10 | Добавлено: 08.12.03 14:52 |
2 Admin: Есть предложение: может стоит сделать сортировку вопросов не по дате создания ветки, а по дате последнего ответа? Так удобнее искать горячие темы. А в самом верху показывать свои вопросы (по логину)? |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 326066673 Вопросов: 368 Ответов: 5968 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 08.12.03 15:45 |
Swift, ![]() |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 43 |
Профиль | Цитата | #12 | Добавлено: 09.12.03 10:31 |
2Павел Sorry |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 204447456 Вопросов: 180 Ответов: 4229 |
Web-сайт: Профиль | Цитата | #13 | Добавлено: 10.12.03 04:51 |
2 Swift. Отсылаю тебя к моему примеру ARPad. Посмотри ссылку на первой странице. RichAPI называется. Там функции чтения и записи файлов реализованы через калбак ф-ии (StreamFileIn и StreamFileOut). Если что не поймёшь - мыль. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 5 Ответов: 43 |
Профиль | Цитата | #14 | Добавлено: 10.12.03 14:33 |
посмотрел пример, спасибо. да, всё так как я писал. Работает, но не долго |
Страница: 1 |
|