SendMessage / LPARAM -> AnyClass

Hallo Community,

ich befasse mich gerade mit der SendMessage API Funktion - Ziel ist es, Daten zwischen zwei Programmen auszutauschen. Wenn diese Daten ein String oder Integer o.ä. sind, ist das ganze offenbar recht einfach, das funktionierte auf Anhieb.

Allerdings müssten in meinem Fall benutzerdefinierte Typen (Klassen) übertragen werden - und zwar Klassen, deren Aufbau/Definition ich nicht verändern kann (die sind so vorgegeben, wie sie eben sind).

Das Senden an sich stellt auch kein Problem dar, allerdings bekomme ich es nicht hin, beim Empfang den LPARAM Teil der Nachricht wieder von einem IntPtr in besagte Klasse(n) umzuwandeln. Eine dieser Klassen heißt StockHistoryType, welche ich hier im Beispiel verwenden werde.

Definition:

Private Declare Auto Function SendMessage Lib „user32“ (ByVal hWnd As IntPtr, _
ByVal wMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As StockHistoryType) As Boolean

Senden:

SendMessage(hWnd, Msg, 1, Data)

Empfangen:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
Dim MsgData as StockHistoryType
’ m.LParam -> MsgData ???
End Sub

Für Hilfe wäre ich echt dankbar, ich habe mich schon halb totgegoogled :frowning:

@Mod Bitte prüfen ob :Net besser owT

[MOD] Nachfrage für Programmier-Sprache
Grüezi MindShape

ich befasse mich gerade mit der SendMessage API Funktion -

…und in welcher Programmier-Sprache tust Du das genau?

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo,

das Problem liegt darin begruendet, das du bei beiden Programmen in unterschiedlichen virtuellen Adressraeumen operierst. Bei der Uebergabe mittels SendMessage wird im Lparam ein 32Bit Wert uebergeben der i.d.F. einen Zeiger auf eine Speicheradresse im Heap-Adressraum des aufrufenden Programms verweist. Diese Adresse ist im empfangenden Programm nicht zugreifbar bzw. ungueltig, die Sicherheitsmechanismen von Windows verhindern diesen Zugriff. Wenn das nicht so waere koennte man kreuz und quer im Windows-Adressraum in jedem x-beliebigen Programm von aussen in dessen Speicher rumfummeln.

Du kannst das umgehen wenn du die einzelnen Slots der Klasse mittels NamedPipes uebertraegts und die Klasse im aufgerufenen Programm wieder aufbaust.

Tschau
Peter

Hallo,

Grüezi MindShape

ich befasse mich gerade mit der SendMessage API Funktion -

…und in welcher Programmier-Sprache tust Du das genau?

Das ist unabhaengig von der verwendeten Sprache, da greifen systemrelevante Mechanismen von Windows. Das funzt mit keiner Entwicklungsumgebung.

Tschau
Peter

Grüezi Peter

ich befasse mich gerade mit der SendMessage API Funktion -

…und in welcher Programmier-Sprache tust Du das genau?

Das ist unabhaengig von der verwendeten Sprache, da greifen
systemrelevante Mechanismen von Windows. Das funzt mit keiner
Entwicklungsumgebung.

Ja, das ist schon klar - aber je nach Programier-Sprache ist das Ansprechen solcher API Funktionen etwas anders.

Und da es hier in diesem Brett in erster Linie um VB/VBA geht wäre die Frage vielleicht bei .NET besser aufgehoben…

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hi

na dann danke für den Tipp, dann werde ich mal diesbezüglich google befragen (das sagt mir nämlich gar nix^^) und schauen, wie weit ich komme.

Gruss

VB und .Net schließen sich nicht aus.
In Visual Studio 2005 war Visual Basic schon .Net basiert und ist es seit dem. Wie es in früheren Version von Visual Studio war, weis ich nicht. Da habeich immer nur C++ benutzt auch bei Visual Studio.Net (Vorgänger von VS2005)
Ich denke du meinst VBA und VB6
.Net ist nicht nur bei C#

Also: die Geschichte mit den Named Pipes habe ich angeschaut, ausprobiert und das funktioniert (mit Byte Arrays). Jetzt brauche ich noch eine zündende Idee, wie man galant eine Klasse zerlegen kann ("… die einzelnen Slots der Klasse … ") - insbesondere, da es sich um stark verschachtelte, verschiedene Klassen handelt, die da übertragen werden müssten.

Hat da auch jemand ein passendes Stichwort zu, wie diese Zerlege-Technik heißt/funktioniert (falls es sie denn gibt)?

Danke!