Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi WM_COPYDATA per Thread verschicken? (https://www.delphipraxis.net/73303-wm_copydata-per-thread-verschicken.html)

DGL-luke 15. Jul 2006 13:50


WM_COPYDATA per Thread verschicken?
 
Hallo,

wenn ich während des verarbeitens einer WM_COPYDATA-Message schon wieder eine an die selbe Anwendung wegschicke, dann scheint das nicht zu funktionieren. Ich habe mir deswegen einen Thread gebaut:

Delphi-Quellcode:
procedure TLogMessageThread.Execute;
begin
  inherited;

  if Interval >= 0 then
    Sleep(Interval);

  Return := SendMessage(TargetHandle,WM_COPYDATA,Senderhandle,Integer(@CopyDataStruct));
end;
und rufe den auf:

Delphi-Quellcode:
//prepare return information
          CopyData.dwData := Integer(ltRegisterAnswer);
          CopyData.cbData := sizeof(TLogInfo);
          CopyData.lpData := GetMemory(CopyData.cbData);
          PLogInfo(CopyData.lpData).YourHandle   := LIReceived.YourHandle;
          PLogInfo(CopyData.lpData).LogIdentifier := LL.Index;

          //send it with the thread, so we can return
          with TLogMessageThread.Create(true) do
            begin
              FreeOnTerminate := True; // fire and forget!
              TargetHandle   := LIReceived.YourHandle;
              Senderhandle   := WHandle;
              Interval       := 5; //just to make sure we have returned
              CopyDataStruct := CopyData;
              // we SHOULD resume the thread, shouldn't we?
              Resume;

              Log('registering initiated');
            end;
es kommt aber beim gegenüber (Application.OnMessage) nix an:

Delphi-Quellcode:
procedure TForm2.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
var CpDt: PCopyDataStruct;
begin
  if Msg.message = MessageQuestion then
    .......
 else if Msg.message = WM_COPYDATA then
    begin
      CpDt := TWMCopyData(Pointer(@Msg)^).CopyDataStruct;
      case TLogType(CpDt.dwData) of
        ltRegisterAnswer:
          begin
            LogIndex := TLogInfo(CpDt.lpData^).LogIdentifier;
            MLog.Lines.Add('we got a log index: ' + IntToStr(LogIndex));
          end;
      end;
    end;
end;
Sprich, die log-message wird nicht geschrieben.

Mach ich was grundlegendes falsch? hätte das Sendmessage auch direkt klappen sollen?

DGL-luke 16. Jul 2006 12:00

Re: WM_COPYDATA per Thread verschicken?
 
*push*

Sind zwar noch nicht ganz 24 Stunden, aber ich wollte das ganze eigentlich heute fertigbringen... und "auf die schnelle" auf TCP/IP über loopback umsteigen wollt ich eigentlich in dieser Phase auch nicht mehr.

Ich werd mal sehen, ob ich irgendwie wenigstens ein kleines Working Example zusammenbring...

SirThornberry 16. Jul 2006 12:09

Re: WM_COPYDATA per Thread verschicken?
 
Was gibst du als Senderhandle an? und hast du innerhalb deines Threads überhaupt ein Fenster was du als Sender angeben kannst?

DGL-luke 16. Jul 2006 12:15

Re: WM_COPYDATA per Thread verschicken?
 
Im Thread nicht... Ich gebe als Senderhandle das Hauptfenster meiner App an.

Ansonsten müsste ich wohl einen Timer setzen oder ähnliches, auf jeden Fall die Nachrichtenbehandlung bei mir beenden und dann erst die nachricht im Hauptthread senden... da hab ich mir halt gedacht, mitm thread gehts eleganter.

SirThornberry 16. Jul 2006 12:23

Re: WM_COPYDATA per Thread verschicken?
 
Zitat:

wenn ich während des verarbeitens einer WM_COPYDATA-Message schon wieder eine an die selbe Anwendung wegschicke, dann scheint das nicht zu funktionieren. Ich habe mir deswegen einen Thread gebaut:
das kann doch gar nicht funktionieren. Wenn du an die gleiche Anwendung/gleiches Handle schickst ist die Anwendung doch mit der ersten Nachricht noch beschäftigt und kann somit erst später deine neue Nachricht verarbeiten. Von der Hinsicht macht es doch auch nur sinn die Nachrichten nacheinander zu senden da die Empfängerseite die Nachrichten auch nur nacheinander empfangen kann wenn diese alle ans gleiche Handle gehen.

DGL-luke 16. Jul 2006 12:33

Re: WM_COPYDATA per Thread verschicken?
 
:roll:

Genau das hab ich zu erklären versucht. Genau deswegen benutz ich ja einen Thread dafür. Der Thread schmeißt die Nachricht in die Nachrichtenschleife der anderen Anwendung und hält die Daten warm, bis mein Hauptthread fertig ist und die andere Anweundung weiter den Messagestack abarbeiten kann und dabei irgendwann auf meine Nachricht stößt. Und dann kommt der thread zurück und löst sich in Luft und das Problem in Wohlgefallen auf. So hätt ich mirs gedacht.

Einziges Problem: Die nachricht kommt offenbar beim "gegner" nicht an.

Also: Legt mir die Windows-API irgendwelche Steine in den Weg, wenn sich der Thread als Hauptthread "ausgibt" bzw. die Message so zusammenstellt wie es der hauptthread getan hätte? Sprich Senderhandle?

EDIT: wäre ja zum Beispiel denkbar dass die Daten unbedingt im Hauptthread, sprich da wo Senderhandle hinzeigt, liegen müssen...

SirThornberry 16. Jul 2006 12:35

Re: WM_COPYDATA per Thread verschicken?
 
hast du schon versucht als Senderhandle einfach "0" zu übergeben?

DGL-luke 16. Jul 2006 12:38

Re: WM_COPYDATA per Thread verschicken?
 
:shock:

Hätt ich mir nie angemaßt... werd ich aber versuchen... ich hab "mein Handle" ja in den Daten selbst liegen...

Nö, hilft rein gar nichts. Das gegenüber bekommt nichts zurück.

EDIT: Das Log sagt auf jeden fall, die nachricht wird versendet.

SirThornberry 16. Jul 2006 12:48

Re: WM_COPYDATA per Thread verschicken?
 
Liste der Anhänge anzeigen (Anzahl: 1)
also ich hab das ganze gerade probiert, und bei mir funktioniert es ohne Probleme.

DGL-luke 16. Jul 2006 13:10

Re: WM_COPYDATA per Thread verschicken?
 
Delphi hat mir gerade eine Beleidigung entgegengeworfen:

Delphi-Quellcode:
procedure TForm2.OnWMCopyData(var Msg: TWMCopyData);
begin
  ShowMessage('Du bist ein Idiot.');
end;
:wall: :wall: :wall: :wall:

Das kommt irgendwie bei Application.OnMessage nicht an... aber bei der Form schon... :dancer2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:00 Uhr.
Seite 1 von 2  1 2      

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