Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Выполнить Callback функцию Добавлено: 04.12.03 11:07  

Автор вопроса:  Swift

Известно, что можно написать Callback функцию и передать её адрес для вызова в dll.

Возможно ли на VB6 решить обратную задачу: выполнить Callback функцию, написанную на VB6, получив её адрес?

Ответить

  Ответы Всего ответов: 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

Ну пишешь функцию в модуле, затем передаёшь её адрес в dll (AddressOf). Оттуда её будут вызывать :)

Неужели никто не знает??

Ответить

Номер ответа: 3
Автор ответа:
 shuffle



Администратор

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #3 Добавлено: 06.12.03 05:14
Когда-то я пытался такое сотворить... Но ничего не получилось... VB вообще не умеет работать с указателями...

Ответить

Номер ответа: 4
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #4
Добавлено: 06.12.03 06:37

Да вроде также как и для внешних библиотек.

Только твоя калбак функция должна сама что то делать, да ещё и значение возвращать.

2 <=Alex=>
для примера посмотри открытие и сохранение файла в моём ArPad'е.

Ответить

Номер ответа: 5
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #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

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-сайт: www.vbnet.ru
 Профиль | | #7
Добавлено: 06.12.03 14:50
Это вообще инфа о CallBack4 не моя.
Все вопросы к Andr <AndreyYalta@yandex.ru>.

Ответить

Номер ответа: 8
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #8
Добавлено: 07.12.03 07:50

Ну раз ты знаешь что такое калбак на ЦеПэПэ, то осталось только обратить внимание на написаное павлом.

Public Function add_AdrProc(ByVal AddressOff_ProcName&;) As Long
add_AdrProc = AddressOff_ProcName
End Function

Ты должен вызывать addresof именно этой(или подобной) функции. addresof add_AdrProc.

Ответить

Номер ответа: 9
Автор ответа:
 Swift



Вопросов: 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
Автор ответа:
 Swift



Вопросов: 5
Ответов: 43
 Профиль | | #10 Добавлено: 08.12.03 14:52

2 Admin:

Есть предложение: может стоит сделать сортировку вопросов не по дате создания ветки, а по дате последнего ответа? Так удобнее искать горячие темы.

А в самом верху показывать свои вопросы (по логину)?

Ответить

Номер ответа: 11
Автор ответа:
 Павел



Администратор

ICQ: 326066673 

Вопросов: 368
Ответов: 5968
 Web-сайт: www.vbnet.ru
 Профиль | | #11
Добавлено: 08.12.03 15:45
Swift, :) зайди в настройки профиля и посмотри там повнимательнее..

Ответить

Номер ответа: 12
Автор ответа:
 Swift



Вопросов: 5
Ответов: 43
 Профиль | | #12 Добавлено: 09.12.03 10:31

2Павел

Sorry :)

Ответить

Номер ответа: 13
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #13
Добавлено: 10.12.03 04:51

2 Swift.

Отсылаю тебя к моему примеру ARPad. Посмотри ссылку на первой странице. RichAPI называется. Там функции чтения и записи файлов реализованы через калбак ф-ии (StreamFileIn и StreamFileOut).

Если что не поймёшь - мыль.

Ответить

Номер ответа: 14
Автор ответа:
 Swift



Вопросов: 5
Ответов: 43
 Профиль | | #14 Добавлено: 10.12.03 14:33

посмотрел пример, спасибо.

да, всё так как я писал. Работает, но не долго :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам