Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

1

02.06.2010, 22:50

String Per PostMessage() weiterreichen [C++ zu C#]

Der Titel sagt schon alles:

Ich habe zwei Anwendungen: Eine C++ Konsolenanwendung und eine C# XNA Anwendung. Die XNA Anwendung bekommt von der C++ Konsole Befehle per PostMessage(). Ich habe für die Message eine eigene Per RegisterWindowMessage() registriert. Die Message wird auch sauber per PeekMessage() in der XNA Anwendung abgefangen.
Nun ist das Problem, dass ich einen String an die XNA Anwendung liefern möchte. Das habe ich durch übergeben der Adresse des C-strings in LPARAM getan. Jedoch komme ich an den String in der XNA Anwendung nicht heran! Ich bekomme immer einen Leerstring. Die Adresse kommt richtig an, habe ich per Debugging überprüft. hier die beiden Codestellen:

C-/C++-Quelltext

1
2
3
/*von c++ gesendet*/
strcpy_s(bufferdata,256,"0,127,255,1,127,255,2,127,255,4,127,255");
PostMessage(HWND_BROADCAST,servomessage,0,reinterpret_cast<LPARAM>(bufferdata));


Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
/*C# fängt ab*/
NativeMessage msg = new NativeMessage();
 if (PeekMessage(out msg, IntPtr.Zero, 0, 0, 1)) 
{
    /*hier springt er rein*/
     if (msg.msg == servomessage)
    {
        string statement = "";
        statement = Marshal.PtrToStringAnsi(msg.lParam);
        /*statement ist ein leestring!*/
        _robot.MoveServos(statement);
    }
}


Wie gesagt, das Event kommt richtig an, aber der String ist immer leer. Ideen?!

Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

2

02.06.2010, 23:10

Du darfst den String nicht auf dem Stack speichern, weil der nicht mehr gültig ist, wenn die C# Anwendung ihn auslesen möchte. Entweder allokierst du welchen, welcher der Empfänger dann natürlich freigeben muss, oder du benutzt SendMessage. Außerdem musst du natürlich beachten, dass jeder Prozess seinen eigenen virtuellen Adressraum hat. Falls das also zwei verschiedene Prozesse sind, musst du den String erst in den anderen Prozess reinscheiben oder was anderes ausdenken ;)

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

03.06.2010, 08:31

also ich habe das char-array in der c++ anwendung auf dem heap angelegt. mir ist heute auch aufgefallen, dass jeder prozess ja seinen eigenen adressraum hat. nur wie schiebe ich den string den anderen prozess unter?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

03.06.2010, 12:36

Da gibts viele Möglichkeiten. Du könntest über ein FileMapping shared Memory erzeugen auf das beide Prozesse zugreifen und deinen String dort ablegen. Alternativ könntest du mit VirtualAllocEx() Speicher auf dem Heap des anderen Prozesses anfordern und dann mit WriteProcessMemory() deinen String dort reinschreiben und dann in deiner Message einen Pointer auf diesen Speicher übergeben. Da bleibt natürlich die Frage wer den Speicher wieder freigibt. Ansonsten gäbe es noch die Möglichkeit die Prozesse über Dateien, Pipes, Mailslots, Sockets, WM_COPYDATA, die Zwischenablage, ...

schau einfach mal da rein ;)
http://msdn.microsoft.com/en-us/library/aa365574(VS.85).aspx

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

03.06.2010, 17:47

Da gibts viele Möglichkeiten. Du könntest über ein FileMapping shared Memory erzeugen auf das beide Prozesse zugreifen und deinen String dort ablegen. Alternativ könntest du mit VirtualAllocEx() Speicher auf dem Heap des anderen Prozesses anfordern und dann mit WriteProcessMemory() deinen String dort reinschreiben und dann in deiner Message einen Pointer auf diesen Speicher übergeben. Da bleibt natürlich die Frage wer den Speicher wieder freigibt. Ansonsten gäbe es noch die Möglichkeit die Prozesse über Dateien, Pipes, Mailslots, Sockets, WM_COPYDATA, die Zwischenablage, ...

schau einfach mal da rein ;)
http://msdn.microsoft.com/en-us/library/aa365574(VS.85).aspx


Also die erste Möglichkeit hört sich ja mal richtig eklig an. ;)
Die anderen wären auch in etwa die Mittel meiner Wahl.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

03.06.2010, 17:55

Also die erste Möglichkeit hört sich ja mal richtig eklig an. ;)

Die erste Möglichkeit is bei weitem weniger eklig als WriteProcessMemory ;)

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

7

04.06.2010, 08:13

ah super genau sowas hab ich gesucht! hab erstmal mit zwischenablage probiert funktioniert soweit auch wenn mr das nicht so wirklich gefällt die dafür zu missbrauchen.
mit dem heap gefällt mir auch nicht so wirklich vielleicht versuche ich mal sockets später, weil irgendwie kommt nicht immer was an, bzw. erst nach einigen klicks mit aktivieren der fenster, das find ich etwas doof.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

04.06.2010, 10:36

Ja, also wenn du mich fragst sieht mir WM_COPYDATA für deinen Fall recht brauchbar aus nachdem du ja mit der Message Queue arbeiten willst. Ansonsten kannst du dir natürlich auch auf Basis von Pipes was basteln oder Mailslots verwenden wenn die Kommunikation nur in eine Richtung gehen soll...

TrommlBomml

Community-Fossil

  • »TrommlBomml« ist der Autor dieses Themas

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

9

05.06.2010, 06:46

ja das werde ich umsetzen. nur hast du ne ahnung wie die fensterklassennamen von xna fenster generiert werden? die sind anscheinend nach einem schema generiert wenn man mal mit spy++ drüberschaufelt.
wobei ich überlege alle fenster mit dem titel meiner xna anwendung zu suchen per findwindow(), und dann nach den fensterklassennamen per regulären ausdruck prüfe. frage ist, woran der fensterklassenname festgelegt wird, habe bisher nix gefunden. oder sollte das in der regel reichen per findwindow nach titel?

Edit: copydata ist doof, braucht laut meinen recherchen wieder sendmessage. ich werde weiter am clipboard bleiben. wenn ich in der xna-anwendung das clipboard wieder leere, dann ist das ja kein problem. und ich hab den code etwas angepasst und scheint besser zu laufen. ich gehe der annahme, dass wenn man bei postmessage anstatt broadcast direkt an das fenster sendet, dass es immer ankommt, wenn das fenster existiert? dann würde mir das reichen, testen werde ich es auf alle fälle.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »TrommlBomml« (05.06.2010, 09:25)


Helmut

5x Contest-Sieger

Beiträge: 692

Wohnort: Bielefeld

  • Private Nachricht senden

10

06.06.2010, 10:07

Also ich verstehe dieses Forum irgendwie nicht.
Wenn man mal Ansifunktionen, Makros, using namespace std oder irgendeinen Firlefranz benutzt wird man hier gleich gesteinigt, aber wenn jemand dem Benutzer die Zwischenablage löscht sagt kein Schwein etwas! Sowas gehört sich wirklich nicht!

Benutz VirtualAllocEx()+WriteProcessMemory()+Google. Das ist sauber und effizient, auch wenn hier etwas anderes behauptet wurde.

Ciao
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender)

Werbeanzeige