vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

Fortgeschrittene Programmierung
Re: Klassen >verhalten< ??? 
Autor: Radeonmaster
Datum: 14.08.05 21:03

Da müssen wir scheinbar tief in die Trickkiste greifen.
Wahrscheinlich geht es einfacher, ich hab es jetzt über die VTable gelöst.

Klasse 1:
Option Explicit
 
Private c   As Class2
 
' callback von Class2
' In einem Code Modul würde CB so aussehen:
'
' Public Function CDB(ByVal this As Object,
'        ByVal dummy1 As Long,
'        ByVal dummy2 As Long,
'        pOut As Long) As Long
'     ...
' End Function
'
' 2 Dummy Argumente, weil CallWindowProc
' 4 Parameter auf den Stack legt.
'
' CB MUSS DIE ERSTE FUNKTION IN DER KLASSE SEIN!
Public Function CB(ByVal dummy1 As Long, ByVal dummy2 As Long) As Long
    Debug.Print "Class 1: Class 2 zerstört"
End Function
 
Private Sub Class_Initialize()
    Debug.Print "Class 1 initialisiert"
 
    Set c = New Class2
 
    ' pointer auf diese Klasse für callback übergeben
    c.TerminateCBObj = ObjPtr(Me)
End Sub
 
Private Sub Class_Terminate()
    Debug.Print "Class 1 zerstört"
End Sub
Klasse 2:
Option Explicit
 
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
  pDst As Any, _
  pSrc As Any, _
  ByVal ByteLen As Long _
)
 
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 lngObject   As Long
 
Public Property Let TerminateCBObj(ByVal lng As Long)
    lngObject = lng
End Property
 
Private Sub Class_Initialize()
    Debug.Print "Class 2 initialisiert"
End Sub
 
Private Sub Class_Terminate()
    SendMsg
    Debug.Print "Class 2 zerstört"
End Sub
 
Private Sub SendMsg()
 
    Dim lngVTable   As Long
    Dim lngOffset   As Long
    Dim lngAddr     As Long
    Dim lngRet      As Long
    Dim hResult     As Long
 
    ' erste Funktion von übergebenem Klassenpointer
    ' über VTable herausfinden
    CopyMemory lngVTable, ByVal lngObject, 4
    lngOffset = lngVTable + &H1C
    CopyMemory lngAddr, ByVal lngOffset, 4
 
    ' Funktion aufrufen
    ' Param 1:    Object Pointer
    ' Param 2, 3: Dummy Argumente
    ' Param 4:    Rückgabewert
    hResult = CallWindowProc(lngAddr, _
                             lngObject, _
                             0, 0, _
                             VarPtr(lngRet))
 
End Sub
Ich würde sagen, das läuft stabil, solange Class 2 einen gültigen Pointer auf Class 1 hat
und CB die erste öffentliche Funktion in Class 1 ist.

http://rm_code.dl.am

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Klassen >verhalten< ???1.115ByteRider14.08.05 14:41
Re: Klassen >verhalten< ???741Radeonmaster14.08.05 16:29
Re: Klassen >verhalten< ???664ByteRider14.08.05 18:11
Re: Klassen >verhalten< ???660Radeonmaster14.08.05 18:40
Re: Klassen >verhalten< ???757ByteRider14.08.05 19:19
Re: Klassen >verhalten< ???663Radeonmaster14.08.05 20:08
Re: Klassen >verhalten< ???650ByteRider14.08.05 20:12
Re: Klassen >verhalten< ???718ByteRider14.08.05 20:57
Re: Klassen >verhalten< ???787Radeonmaster14.08.05 21:03
Re: Klassen >verhalten< ???655Radeonmaster14.08.05 21:06
Re: Klassen >verhalten< ???661ByteRider14.08.05 21:29
Re: Klassen >verhalten< ???639ByteRider14.08.05 21:36
Re: Klassen >verhalten< ???639Radeonmaster14.08.05 21:47
Re: Klassen >verhalten< ???801Radeonmaster14.08.05 22:08
Re: Klassen >verhalten< ???638ByteRider15.08.05 08:18
Re: Klassen >verhalten< ???630Radeonmaster15.08.05 10:59
Re: Klassen >verhalten< ???634ByteRider15.08.05 17:43
Re: Klassen >verhalten< ???656ByteRider15.08.05 18:13
Re: Klassen >verhalten< ???649Radeonmaster15.08.05 19:31
Re: Klassen >verhalten< ???647ByteRider16.08.05 12:04
Re: Klassen >verhalten< ???710ByteRider16.08.05 12:12
Re: Klassen >verhalten< ???638Radeonmaster16.08.05 12:48
Re: Klassen >verhalten< ???657ByteRider16.08.05 13:00
Re: Klassen >verhalten< ???655ByteRider16.08.05 13:03
Re: Klassen >verhalten< ???646Radeonmaster16.08.05 13:13
Re: Klassen >verhalten< ???666ByteRider16.08.05 13:26
Re: Klassen >verhalten< ???653Radeonmaster16.08.05 13:38
Re: Klassen >verhalten< ???631ByteRider16.08.05 13:56
Re: Klassen >verhalten< ???634Radeonmaster16.08.05 14:01
Re: Klassen >verhalten< ???711ByteRider16.08.05 14:16
Re: Klassen >verhalten< ???697Radeonmaster16.08.05 14:36
Re: Klassen >verhalten< ???660Dirk16.08.05 14:26

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel