vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 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 22:08

Das würde dann so aussehen:

Class 1:
Option Explicit
 
Private Type udtTest
    szString        As String * 255
    lngLong         As Long
    intInteger      As Integer
End Type
 
Private Declare Sub CopyMemory Lib "kernel32" _
Alias "RtlMoveMemory" ( _
  pDst As Any, _
  pSrc As Any, _
  ByVal ByteLen As Long _
)
 
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!
Private Function CB(ByVal msg As Long, ByVal pUDT As Long) As Long
    Dim udt As udtTest
    Select Case msg
        Case 1
            CopyMemory udt, ByVal pUDT, LenB(udt)
            Debug.Print "UDT von Cls 2: " & udt.szString
        Case 2
            Debug.Print "Class 1: Class 2 zerstört"
    End Select
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
Class 2:
Option Explicit
 
Private Type udtTest
    szString        As String * 255
    lngLong         As Long
    intInteger      As Integer
End Type
 
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()
    Dim udt As udtTest
    With udt
        .intInteger = 2
        .lngLong = 4
        .szString = StrConv("hi", vbFromUnicode)
    End With
 
    SendMsg 1, VarPtr(udt)  ' MSG 1: UDT Übergabe
    SendMsg 2               ' MSG 2: Class 2 Terminate
 
    Debug.Print "Class 2 zerstört"
End Sub
 
Private Sub SendMsg(Optional param1 As Long, Optional param2 As Long)
 
    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, _
                             param1, param2, _
                             VarPtr(lngRet))
 
End Sub
Länger sollte es für ein eigentlich so simples Problem nicht werden.

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< ???742Radeonmaster14.08.05 16:29
Re: Klassen >verhalten< ???664ByteRider14.08.05 18:11
Re: Klassen >verhalten< ???661Radeonmaster14.08.05 18:40
Re: Klassen >verhalten< ???758ByteRider14.08.05 19:19
Re: Klassen >verhalten< ???663Radeonmaster14.08.05 20:08
Re: Klassen >verhalten< ???651ByteRider14.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< ???640ByteRider14.08.05 21:36
Re: Klassen >verhalten< ???640Radeonmaster14.08.05 21:47
Re: Klassen >verhalten< ???802Radeonmaster14.08.05 22:08
Re: Klassen >verhalten< ???639ByteRider15.08.05 08:18
Re: Klassen >verhalten< ???630Radeonmaster15.08.05 10:59
Re: Klassen >verhalten< ???634ByteRider15.08.05 17:43
Re: Klassen >verhalten< ???657ByteRider15.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< ???639Radeonmaster16.08.05 12:48
Re: Klassen >verhalten< ???658ByteRider16.08.05 13:00
Re: Klassen >verhalten< ???656ByteRider16.08.05 13:03
Re: Klassen >verhalten< ???647Radeonmaster16.08.05 13:13
Re: Klassen >verhalten< ???667ByteRider16.08.05 13:26
Re: Klassen >verhalten< ???654Radeonmaster16.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< ???698Radeonmaster16.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