![]() |
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:
und rufe den auf:
procedure TLogMessageThread.Execute;
begin inherited; if Interval >= 0 then Sleep(Interval); Return := SendMessage(TargetHandle,WM_COPYDATA,Senderhandle,Integer(@CopyDataStruct)); end;
Delphi-Quellcode:
es kommt aber beim gegenüber (Application.OnMessage) nix an:
//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;
Delphi-Quellcode:
Sprich, die log-message wird nicht geschrieben.
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; Mach ich was grundlegendes falsch? hätte das Sendmessage auch direkt klappen sollen? |
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... |
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?
|
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. |
Re: WM_COPYDATA per Thread verschicken?
Zitat:
|
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... |
Re: WM_COPYDATA per Thread verschicken?
hast du schon versucht als Senderhandle einfach "0" zu übergeben?
|
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. |
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.
|
Re: WM_COPYDATA per Thread verschicken?
Delphi hat mir gerade eine Beleidigung entgegengeworfen:
Delphi-Quellcode:
:wall: :wall: :wall: :wall:
procedure TForm2.OnWMCopyData(var Msg: TWMCopyData);
begin ShowMessage('Du bist ein Idiot.'); end; Das kommt irgendwie bei Application.OnMessage nicht an... aber bei der Form schon... :dancer2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz