Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Text (Pfadangabe) per Windows Message verschicken (https://www.delphipraxis.net/133736-text-pfadangabe-per-windows-message-verschicken.html)

lbccaleb 7. Mai 2009 19:35


Text (Pfadangabe) per Windows Message verschicken
 
Hallo,

ist es möglich Text per eigene Message zu verschicken und dabei nicht WM_COPYDATA zu nutzen??

Habe schon das hier gefunden:

Send Message


aber das ist nicht das wahre, da er ab und zu nur Kaudawelsch bekommt! Oder liegts an mir??

oki 7. Mai 2009 20:02

Re: Text (Pfadangabe) per Windows Message verschicken
 
Reservier den notwendigen Speicher und übergib den Zeiger in LParam oder WParam. Dein Beispiel ist aber auch nichts anderes. Das gilt natürlich auch für Zeiger auf Records oder Instancen von Klassen (also Objekte).

Gruß oki

lbccaleb 7. Mai 2009 20:17

Re: Text (Pfadangabe) per Windows Message verschicken
 
Wie soll ich den speicher reservieren? In der anderen Anwendung weiß ich ja nicht wie groß der Text ist, der dort ankommt? Oder hab ich gerade nur ne Denkblockade?

himitsu 7. Mai 2009 20:25

Re: Text (Pfadangabe) per Windows Message verschicken
 
nja, direkt Speicher reservieren mußt du nicht ... du mußt nur einen Zeiger auf die geünschten Daten verschicken und beim Empfänger ab dieser Adresse die Daten auslesen (wenn es ein anderer Prozeß ist, dann z.B. per MSDN-Library durchsuchenReadProcessMemory)

oki 7. Mai 2009 20:30

Re: Text (Pfadangabe) per Windows Message verschicken
 
Joop, so wie himitsu es beschreibt. Eigentlich ist jede Variable auch ein Zeiger auf eine Speicherstelle. Der Witz ist nur, ob dieser Zeigen auch noch gültig ist wenn die Message ankommt. Bei einer lokalen Variable sehe ich das sehr kritisch.
Die Verwendung von SendMessage kommt nicht von Ohne. SendMessage wartet eigentlich auf die Ausführung und kehrt nach der Ausführung wieder zurück. Damit sollte eigentlich nichts schief gehen. Vertrauen würd ich darauf jetzt aber nicht.

Gruß oki

lbccaleb 7. Mai 2009 20:45

Re: Text (Pfadangabe) per Windows Message verschicken
 
Ich hab jetzt noch eine Möglichkeit gefunden das mit der GlobalAtom Function von Windows zu machen! Ist das eine gute lösung oder sollte ich davon lieber die Finger lassen? Hab nicht wirklich nen Schimmer wozu genau diese GlobalAtom Function ist oO

oki 7. Mai 2009 20:55

Re: Text (Pfadangabe) per Windows Message verschicken
 
Damit kannst du sozusagen einen systemweiten Wert registrieren (oder so). Das ist aber eher nicht dein Weg. Mehr mit Kanonen auf Spatzen geschossen.

Mußt du denn unbedingt SendMessage verwenden? Trotzdem sollte das mit dem PChar im Param klappen. Wenn dabei Mist raus kommt, dann ist dein Zeiger ungültig geworden oder an einer anderen Stelle schmiert was über den Speicher.

Gruß oki

lbccaleb 7. Mai 2009 21:09

Re: Text (Pfadangabe) per Windows Message verschicken
 
Zitat:

Zitat von oki
Mußt du denn unbedingt SendMessage verwenden? Trotzdem sollte das mit dem PChar im Param klappen. Wenn dabei Mist raus kommt, dann ist dein Zeiger ungültig geworden oder an einer anderen Stelle schmiert was über den Speicher.

Gruß oki

Wieso? Was sollte ich sonnst verwenden? Ich schicke eine Pfadangabe als PChar in eine andere instanz der selben Anwendung (in dem Fall die Hauptinstanz) in welcher bei ankunft der Message was der Pfad (in dem Fall ne Medien Datei) abgespielt werden soll!

Messages währen eigentlich genau das richtige denke ich :gruebel:

Muetze1 7. Mai 2009 22:11

Re: Text (Pfadangabe) per Windows Message verschicken
 
Nutze dazu u.a. die GlobalLock() Funktion. Du versendest das Handle und jede Anwendung holt sich den Zeiger für den Zugriff mit GlobalLock.

lbccaleb 8. Mai 2009 05:21

Re: Text (Pfadangabe) per Windows Message verschicken
 
Habs jetzt so gelöst, aber irgendwie bekomme ich immer nur die ersten 3 Zeichen von der Pfandangabe! Was ist da noch falsch?


Delphi-Quellcode:
procedure GlobalAllocFileName(aWnd: HWND; aText: String);
var
  Data: THandle;
  DataPtr: Pointer;
  Size: Integer;
  oldWND: HWND;
begin
  Size := Length(aText) + 1;

    Data := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, Size);
    try
      DataPtr := GlobalLock(Data);
      try
        Move(PChar(aText)^, DataPtr^, Size);
            PostMessage(aWnd, WM_TSOPLAYFILE, INTEGER(dataptr^), 0)

      finally
        GlobalUnlock(Data);
      end;
    except
      GlobalFree(Data);
      raise;
    end;
end;
Den Code hab ich mehr oder weniger hier aus dem Forum!


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:02 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz