Как вы пишете функцию обратного вызова в VB6? Я знаю, что AddressOf получает вас, функция получает адрес в Long. Но как мне вызвать функцию с адресом памяти? Благодаря!Как написать обратный вызов в VB6?
ответ
Я не знаю точно, что вы пытаетесь сделать.
К invert control просто создайте функцию обратного вызова в классе. Затем используйте экземпляр класса (объекта) для выполнения обратного вызова.
- Если вам нужно переключиться между различными процедурами во время выполнения, у вас есть отдельные классы, которые реализуют один и тот же интерфейс - strategy pattern.
- IMHO
AddressOf
слишком сложно и рискованно использовать таким образом.
AddressOf
должны использоваться только тогда, когда вам нужно register callback functions с Windows API.
Я отправил свое намерение в основной поток комментариев. Но я буду перепечатывать здесь: у меня есть функция в модуле, которая занимает больше нескольких циклов. Я думал об использовании обратного вызова из функции, чтобы позвонивший знал, что это прогресс. Поэтому я бы использовал его почти как событие, за исключением функции, а не класса. –
К сожалению, я пропустил эти комментарии. Ну, не могли бы вы передать объект функции и перезвонить в объект? Или помещать функцию в новый класс и вызывать события из класса? Оба являются красивыми чистыми OO-образцами. Обходные пути из-за отсутствия делегатов в VB6. – MarkJ
This post На сайте vbforums.com приведен пример использования функции AddressOf и CallWindowProc для выполнения процедуры обратного вызова.
код с поста:
Private Declare Function CallWindowProc _
Lib "user32.dll" Alias "CallWindowProcA" (_
ByVal lpPrevWndFunc As Long, _
ByVal hwnd As Long, _
ByVal msg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long
Private Sub ShowMessage(_
msg As String, _
ByVal nUnused1 As Long, _
ByVal nUnused2 As Long, _
ByVal nUnused3 As Long)
'This is the Sub we will call by address
'it only use one argument but we need to pull the others
'from the stack, so they are just declared as Long values
MsgBox msg
End Sub
Private Function ProcPtr(ByVal nAddress As Long) As Long
'Just return the address we just got
ProcPtr = nAddress
End Function
Public Sub YouCantDoThisInVB()
Dim sMessage As String
Dim nSubAddress As Long
'This message will be passed to our Sub as an argument
sMessage = InputBox("Please input a short message")
'Get the address to the sub we are going to call
nSubAddress = ProcPtr(AddressOf ShowMessage)
'Do the magic!
CallWindowProc nSubAddress, VarPtr(sMessage), 0&, 0&, 0&
End Sub
Очень рискованно использовать AddressOf, как это. Почему бы просто не создать функцию обратного вызова в классе и использовать экземпляр (объект) для выполнения обратного вызова? – MarkJ
... Если вы допустили ошибку, все ваше приложение умрет с необработанной ошибкой исключения. – MarkJ
@MarkJ: Я согласен. Это всего лишь пример одного из способов сделать это - не обязательно один, который я бы выбрал. –
- 1. Как написать неблокирующий обратный вызов в Javascript?
- 2. Как написать обратный вызов для всплывающего меню в Matlab?
- 3. Как написать обратный вызов непосредственно вызываемой функции в цикле?
- 4. Как написать обратный вызов для всплывающего меню в Matlab?
- 5. Как передать обратный вызов как переменную в предопределенный обратный вызов
- 6. Обратный вызов в JNI
- 7. Как написать функцию jquery, которая принимает обратный вызов как параметр
- 8. Как мне создать обратный вызов
- 9. Функция Async JavaScript на стороне клиента (как написать обратный вызов)
- 10. Как написать функцию jquery, которая принимает обратный вызов
- 11. Генератор как обратный вызов
- 12. Как использовать обратный вызов
- 13. Как профилировать обратный вызов
- 14. SQLite UDF - обратный вызов VBA
- 15. Как написать консоль отладки в VB6?
- 16. Обратный вызов в Rails
- 17. Обратный вызов в nodejs
- 18. Обратный вызов в chrome.tts.speak?
- 19. Как проверить обратный вызов в ожидании?
- 20. Вызов FindMimeFromData из VB6
- 21. callback() или обратный обратный вызов()
- 22. Блестящий обратный вызов DataTable
- 23. Можно ли написать обратный вызов jQuery для «on-spellcheck-complete»?
- 24. Обратный звонок от C++ для VB6 в UI Thread
- 25. Прервать вызов «полный:» Обратный вызов
- 26. Многопоточный обратный вызов
- 27. Как настроить обратный вызов facebook?
- 28. Как javascript реализует обратный вызов?
- 29. Вызовите исключение как обратный вызов
- 30. Метод function.call как обратный вызов
Для чего нужен обратный вызов? В зависимости от этого ответ будет сильно отличаться. –
У меня есть функция в модуле, которая занимает больше нескольких циклов. Я думал об использовании обратного вызова из функции, чтобы позвонивший знал, что это прогресс. Поэтому я бы использовал его почти как событие, за исключением функции, а не класса. –