AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WM_COPYDATA per Thread verschicken?
Thema durchsuchen
Ansicht
Themen-Optionen

WM_COPYDATA per Thread verschicken?

Ein Thema von DGL-luke · begonnen am 15. Jul 2006 · letzter Beitrag vom 16. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

WM_COPYDATA per Thread verschicken?

  Alt 15. Jul 2006, 14:50
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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:00
*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...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:09
Was gibst du als Senderhandle an? und hast du innerhalb deines Threads überhaupt ein Fenster was du als Sender angeben kannst?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:15
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:23
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:33


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...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#7

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:35
hast du schon versucht als Senderhandle einfach "0" zu übergeben?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:38


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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#9

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 13:48
also ich hab das ganze gerade probiert, und bei mir funktioniert es ohne Probleme.
Angehängte Dateien
Dateityp: zip testprojekte_757.zip (15,3 KB, 16x aufgerufen)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: WM_COPYDATA per Thread verschicken?

  Alt 16. Jul 2006, 14:10
Delphi hat mir gerade eine Beleidigung entgegengeworfen:

Delphi-Quellcode:
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...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:52 Uhr.
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