Announcement

Collapse
No announcement yet.

String mit PostMessage versenden

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • String mit PostMessage versenden

    Hallo,<br>weiß jemand, wie man einen String mit PostMessage versenden kann?<br>:-) Jens Schumann

  • #2
    Soweit wie mir bekannt ist, kann ich in den Parametern (lParam & Wparam) nur Zahlen zuweisen.

    Warum erstellst Du keine DLL in der Du die Daten speicherst, sendest ein MSG an das andere Programm, und es holt sich die Daten aus der DLL. Du kannst es aber auch via SHAREMEM im Speicher schreiben und von dort abholen lassen

    Comment


    • #3
      Hallo,

      es ist zwar richtig, dass man in lParam und wParam nur Zahlen transportieren kann, aber ein <b>PChar</b> ist nur eine Zahl (Adresse auf das erste Zeichen in der Zeichenkette). Daher kann man über den Adresswert dieser Variable übergeben:
      <pre>
      procedure TForm1.Button1Click(Sender: TObject);
      var
      pText : PChar;
      begin
      pText := AllocMem(99);
      try
      StrPCopy(pText, 'Das ist ein Test');
      SendMessage(Handle, WM_SETTEXT, 0, Integer(pText));
      finally
      FreeMem(pText);
      end;
      end;
      </pre>
      Die allesentscheidende Frage ist jedoch, ob sich der Empfänger im gleichen Prozess befindet oder nicht? Wenn das Empfänger-Fenster in einem anderen Prozess liegt, muss man auf die spezielle Windows-Botschaft <b>WM_COPYDATA</b> zurückgreifen. In diesem Fall kümmert sich Windows automatisch im Hintergrund um das Kopieren der Daten in den Ziel-Prozess, so dass der Zeigerwert wieder gültig wird. Ein Beispielprojekt für WM_COPYDATA ist in meinem Buch <i>Delphi Win32-Lösungen</i> zu finden.

      &#10

      Comment


      • #4
        Hallo Herr Kosch,<br>die WM_COPYDATA Botschaft ist eine meiner lieblings Botschaften, um Daten von einen Prozess zum Anderen zu kopieren. Ihr Win32 Buch liefert dafür ein ausgezeichnetes Beispiel. <br>Ich möchte aber einen String mit Postmessage aus einem Thread herraus an den Hauptthread schicken. Wie ich hier im Forum gelernt habe ist SendMessage aber nicht threadsafe. Deshalb möchte ich PostMessage nehmen. Wenn ich in Ihrem Beispiel SendMessage gegen PostMessage austausche, kann es passieren, dass der Thread FreeMem(pText) aufruft, bevor der HauptThread PostMessage bearbeitet. Das würde bedeuten, das der Zeiger auf pText im Hauptthread nicht mehr gültig ist. Das ist mein Problem. <br>Wenn WM_COPYDATA in der Lage ist Daten zwischen zwei Prozessen auszutauschen und ein Prozess ist ja im weitesten Sinne auch nur ein Thread, dann müßte WM_COPYDATA mit PostMessage aus einem Thread herraus funktionieren.<br>:-) Jens Schuman

        Comment


        • #5
          Hallo,

          wenn man eine globale Variable vom Typ <b>array[0..x] of Char</b> als Puffervariable für die Zeichenkette deklariert und ggf. über Critical Sections etc. schützt, sollte das FreeMem-Problem "elegant" umschifft werden können, da in diesem Fall die Puffervariable auch nach Thread-Ende noch gültig ist.

          Beim Einsatz von WM_COPYDATA ist Win32 so clever, die zusätzlichen Kopieraktionen nur dann vorzunehmen, wenn tatsächlich eine Prozessgrenze zu überwinden ist und die Zeiger ohne Vorbereitung nicht gültig sind

          Comment


          • #6
            Hallo Herr Kosch,<br>WM_COPYDATA war ein flop, da sich diese Botschaft nur mit SendMessage verschicken läßt.<br>Da ich mit mehreren Threads rechnen muß, und jeder Thread einen anderen Text setzen kann, kommt die Lösung mit der globalen Variablen nicht in Frage. Mit Synchronize scheint die Sache zu laufen. Auf PostMessage bin ich kommen, weil ich mir dachte, probiers doch mal mit PostMessage. <br>:-) Jens Schuman

            Comment


            • #7
              Hallo Herr Kosch,

              ich versuche mit wm_copydata einen Text z.B. an Notepad zu versenden, aber nichts kommt an. Ich benutze zum Testen exakt Ihr Beispiel aus dem Buch WIN32-Lösungen. Wird wm_copydata von einem (fremden) Programm nicht automatisch ausgewertet?

              Danke..

              Comment


              • #8
                Kann jemand helfen?

                Danke..

                Comment


                • #9
                  Die Antwort ist ziemlich einfach,<br>
                  Was soll Notepad mit der Nachricht machen ?<p>
                  Wie würde Dein Programm auf eine Nachricht reagieren, dessen Sinn und Unsinn ihm nicht bekannt ist?<br>Wie soll man auf eine Nachricht reagieren, deren Interpretation nicht klar ist?<p>
                  Notepad reagiert einfach nicht auf Deine Nachricht, da es nicht weiß, was es damit anfangen soll.<p>
                  Gruß Nic

                  Comment


                  • #10
                    Alles klar, danke

                    Comment

                    Working...
                    X