SendMessage() userdefined

Thomasio

Erfahrenes Mitglied
Das ist jetzt schon fast peinlich, aber ich bringe es nicht auf die Reihe.

Ich will einen std::string von einer Anwendung an eine Andere schicken, mit einer selbstdefinierten Message.

Also habe ich in beiden Anwendungen zuerst mal

Code:
const UINT MyMessage = RegisterWindowMessage("SomeUniqueText");

Dann mache ich beim Absender:

Code:
std::string x = "Mein Text";
SendMessage(FindWindow("Empfaenger",0),MyMessage,0,(LPARAM)x.c_str());

Beim Empfänger probiere ich dann rum wie blöd, aber irgendwas mache ich trotzdem immer wieder falsch, bzw. ich habe beim Empfänger in x immer wieder was anderes drin, meistens Müll.
Z.B. so:

Code:
if(msg == MyMessage)
{
const char * temp = (const char*)lParam;
std::string x(temp);
}

Kann mir jemand (für ganz Doofe) erklären, wie man das richtig macht?
 
Zuletzt bearbeitet:
Hallo,

da jedes Programm einen eigenen Speicher hat ist es nicht so ohne weiteres möglich Daten von einem zum nächsten Programm zu schicken.

Normalerweise kann ein Programm nicht auf den Speicher eines anderen Programms zugreifen. Dass heißt wenn du dem zweiten Programm einen Zeiger auf eine Zeichenkette sendest, wird dieser Zeiger nicht auf die Zeichenkette zeigen, sondern auf das, was an gleicher Speicherstelle im anderen Programm liegt.

Thema: Virtual Memory

Gruß
Anfänger
 
Zuletzt bearbeitet:
Hallo Thomasio,

probier es mal mit WM_COPYDATA:
C++:
// Sender
std::string x = "Mein Text";
COPYDATASTRUCT cds;
cds.dwData = MyMessage;
cds.lpData = (PVOID)x.c_str();
cds.cbData = x.length() + 1;

SendMessage(FindWindow("Empfaenger", 0),
            WM_COPYDATA,
            (WPARAM)hWnd,
            (LPARAM)&cds);

// Empfänger
if (msg == WM_COPYDATA) {
  COPYDATASTRUCT *pcds = (PCOPYDATASTRUCT)lParam;
  if (pcds->dwData == MyMessage) {
    std::string x((char *)(pcds->lpData));
  }
}

Grüße, Matthias
 
Autsch .... logisch, das hatte ich kurzzeitig vergessen.
Ok, dann zurück zu dem Problem, warum ich überhaupt damit angefangen habe.

Man kann Messages zwischen 2 Anwendungen verschicken, mit WM_COPYDATA. Dummerweise gibt es aber einige Freeware-Programmierer die WM_COPYDATA via HWND_BROADCAST verschicken, sprich wenn mein Empfänger auf WM_COPYDATA wartet, kann es passieren, dass ich da Messages bekomme, die ich gar nicht haben will.

Ich müsste also entweder jeder Message eine eigene Signatur geben, oder eine Alternative zu WM_COPYDATA finden.
Meine erste Idee war .... siehe oben.

Welche Möglichkeiten hätte ich denn sonst noch?
 
Man kann Messages zwischen 2 Anwendungen verschicken, mit WM_COPYDATA. Dummerweise gibt es aber einige Freeware-Programmierer die WM_COPYDATA via HWND_BROADCAST verschicken, sprich wenn mein Empfänger auf WM_COPYDATA wartet, kann es passieren, dass ich da Messages bekomme, die ich gar nicht haben will.
Du kannst ja einerseits den Member dwData von COPYDATASTRUCT frei wählen, andererseits kannst du den Absender der Nachricht über den wParam bestimmen. Damit sollte es doch möglich sein, diese unerwünschten Nachrichten zu filtern.

Grüße, Matthias
 
Wie wäre es mit eine TCP Verbindung zwischen beiden Programmen?

Es gibt so viele verschiedene Ports dakommt dir bestimmt keiner dazwischen
und du kanst so viele Daten senden wie du willst.

Gruß,
Anfänger
 
Hui, klar, Absender steht im wParam, das muss ich mal genauer anschauen, auf jeden Fall gute Idee.

TCP-Verbindung ist auch nicht blöd, aber da habe ich das Problem mit dem return Wert, bzw. keinen Plan, wie ich das in Message-ähnlicher Form gestalten soll.

int Antwort = send(SOCKET ...);

ist halt nicht machbar.
Ausserdem müsste der Empfänger einen Thread im Hintergrund laufen haben, der ständig auf eineghende Verbindungen wartet, was wiederum bedeutet, ich müsste das Ganze multithreaded schreiben, was wiederum zu 1000 Problemen mit Synchronisation führt.

Auf jeden Fall danke euch beiden.
 
Zurück