Как написать обратный звонок в VB6? - PullRequest
5 голосов
/ 13 ноября 2010

Как вы пишете функцию обратного вызова в VB6?Я знаю, AddressOf получает вас, функция получает адрес в Long.Но как мне вызвать функцию с адресом памяти?Спасибо!

Ответы [ 2 ]

7 голосов
/ 13 ноября 2010

В этом сообщении на 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 
4 голосов
/ 15 ноября 2010

Я не совсем уверен, что вы пытаетесь сделать.

Чтобы инвертировать управление , просто создайте функцию обратного вызова в классе.Затем используйте экземпляр класса (объект) для выполнения обратного вызова.

  • Если вам нужно переключаться между различными подпрограммами во время выполнения, используйте отдельные классы, которые реализуют один и тот же интерфейс - шаблон стратегии .
  • ИМХО AddressOf слишком сложно и рискованно использовать таким образом.

AddressOf следует использовать только , если вам нужно зарегистрировать функции обратного вызова с помощью Windows API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...