CallWindowProcA

08/07/2011 - 09:50 von Heinz-Mario Frühbeis | Report spam
Hallo!

2 DLL
Beide DLL werden mit CreateObject() erzeugt
Auch ansonsten werden (außer die Std-Verweise) keine weiteren Verweise
verwendet

'Dll_1 (Projekt11.Class1):
'
'Klasse
Private Sub Class_Initialize()
Dim obj As Object
Set obj = CreateObject("Projekt12.Class1")
obj.GetModPtr GetPtr(AddressOf Module1.Message)
Set obj = Nothing
End Sub

Private Function GetPtr(ByVal vPtr As Long) As Long
GetPtr = vPtr
End Function

'Modul:
Public Function Message(ByVal hIdent As Long _
, ByVal iMsg As Long, ByVal lIdent As Long _
, ByVal vArg As Long) As Long
Message = 1
End Function

'Dll_2 (Projekt12.Class1):
'
Private Declare Function IDAMessage Lib "user32" Alias "CallWindowProcA"
(ByVal modPtr As Long _
, ByVal hIdent As Long, ByVal iMsg As Long _
, ByVal lIdent As Long, ByVal vArg As Long) As Long

Public Function GetModPtr(ByVal vPtr As Long) As Long
IDAMessage vPtr, 0, 0, 0, 0 ' -> hier ratzt die IDE ab
End Function

Bei mir also ratzt die IDE ab.
Meine Frage dazu:
Kann das überhaupt funktionieren?
(Auch mal speziell mit den DLL und CreateObject() gesehen?)
Wenn es doch (wider erwarten) funktionieren kann ... dann wàre es nett, wenn
man mir noch auf die Sprünge helfen könnte.

Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Armin Zingler
08/07/2011 - 11:18 | Warnen spam
Am 08.07.2011 09:50, schrieb Heinz-Mario Frühbeis:
Hallo!

2 DLL
Beide DLL werden mit CreateObject() erzeugt
Auch ansonsten werden (außer die Std-Verweise) keine weiteren Verweise
verwendet

'Dll_1 (Projekt11.Class1):
'
'Klasse
Private Sub Class_Initialize()
Dim obj As Object
Set obj = CreateObject("Projekt12.Class1")
obj.GetModPtr GetPtr(AddressOf Module1.Message)
Set obj = Nothing
End Sub

Private Function GetPtr(ByVal vPtr As Long) As Long
GetPtr = vPtr
End Function

'Modul:
Public Function Message(ByVal hIdent As Long _
, ByVal iMsg As Long, ByVal lIdent As Long _
, ByVal vArg As Long) As Long
Message = 1
End Function

'Dll_2 (Projekt12.Class1):
'
Private Declare Function IDAMessage Lib "user32" Alias "CallWindowProcA"
(ByVal modPtr As Long _
, ByVal hIdent As Long, ByVal iMsg As Long _
, ByVal lIdent As Long, ByVal vArg As Long) As Long

Public Function GetModPtr(ByVal vPtr As Long) As Long
IDAMessage vPtr, 0, 0, 0, 0 ' -> hier ratzt die IDE ab
End Function

Bei mir also ratzt die IDE ab.
Meine Frage dazu:
Kann das überhaupt funktionieren?
(Auch mal speziell mit den DLL und CreateObject() gesehen?)
Wenn es doch (wider erwarten) funktionieren kann ... dann wàre es nett, wenn
man mir noch auf die Sprünge helfen könnte.




Ich kann den Fehler teilweise nachvollziehen. Es funktioniert hier sowohl
wenn sich dll_2 in derselben Projektgruppe befindet als auch wenn dll_2 als
kompilierte Dll vorliegt. Nur, wenn dll_2 in einer eigenstàndigen IDE-Instanz
làuft, schmiert diese ab, d.h. verabschiedet sich wortlos. Das wird wohl
wieder eine dieser Einschrànkungen in diesem Szenario mit nur 99% korrekt
simuliertem Inproc-Verhalten sein. Ursache ist möglicherweise die Inkompatibilitàt
von (virtuellen) Adressen über Prozessgrenzen hinweg. COM-IPC kann VB/COM noch
gut regeln aber von prozessabhàngigen Speicheradressen, die du in Long-Variablen
herumführst, hat es keine Ahnung.

Falls der Fehler bei dir nur unter denselben Umstànden auftritt, wàre die Lösung,
entweder nur kompilierte Dlls zu verwenden, oder die Dlls in dieselbe Projektgruppe
zu stecken, oder auf CallWindowProc zu verzichten und stattdessen normale Methodenaufrufe
auszuführen.


Armin

Ähnliche fragen