Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Mit Service auf Desktop zeichnen (https://www.delphipraxis.net/76522-mit-service-auf-desktop-zeichnen.html)

SirThornberry 11. Sep 2006 11:39

Re: Mit Service auf Desktop zeichnen
 
Es ist entscheident an welcher Stelle du den Source plazierst. SetThreadDesktop funktioniert nur wenn der Thread noch keine Handles zum aktuellen Desktop offen hat. Am besten du baust in den Source einige Debugausgaben ein (zum Beispiel schreiben in Datei etc.) um zu sehen an welcher Anweisung es hakt.
Wenn du den aufruf von unten in einen Frischen Thread packst sollte es zum Beispiel klappen weil der Thread noch keine Handles auf einen Desktop offen hat.

Olli 11. Sep 2006 11:53

Re: Mit Service auf Desktop zeichnen
 
Keinen Bock es zu schicken oder ist es was von deiner Firma?

SirThornberry 11. Sep 2006 12:01

Re: Mit Service auf Desktop zeichnen
 
Doch, ich werds noch schicken. Das Problem ist das ich das Projekt jetzt in eine andere Richtug weiter gebaut hab. Ich hab also den Button zum starten von Prozessen raus genommen weil es nicht funktioniert hat und bin dann zu diesem Ergebnis gekommen:
http://www.delphipraxis.net/internal...=608398#608398

Ich könnte im Moment nur dieses Projekt schicken ohne den Button. Aber ich wollt bis heute Abend warten wenn ich bischen mehr zeit hab und das Projekt kopieren und einen Button einbauen.

gsh 12. Sep 2006 11:24

Re: Mit Service auf Desktop zeichnen
 
ok ich glaub ich weiss jetzt mein Problem
Delphi-Quellcode:
var
  lDesktop, lStationNew  : Cardinal;
begin
  lStationNew := OpenWindowStation('WinSta0', True, GENERIC_ALL);
  if (lStationNew <> 0) then
  begin
    SetProcessWindowStation(lStationNew);
    lDesktop := OpenDesktop('Default', DF_ALLOWOTHERACCOUNTHOOK, True, GENERIC_ALL);
    if (lDesktop <> 0) then
    begin
      if SetThreadDesktop(lDesktop) then //Hier wird immer false zurück gegeben und somit des Form1 nicht erzeugt
      begin
        Form1 := TForm1.Create(Service1);
        Form1.Show;
      end;
      CloseDesktop(lDesktop);
    end;
    CloseWindowStation(lStationNew);
  end;
end;
aber warum? Ich hab des jetzt testweiße im ServiceCreate aufgerufen, also als allererstes. :wall:

gsh 13. Sep 2006 07:37

Re: Mit Service auf Desktop zeichnen
 
*push*

SirThornberry 13. Sep 2006 08:26

Re: Mit Service auf Desktop zeichnen
 
Hast du denn, wie ich es geschrieben hab, das ganze in einen Thread ausgelagert? Das Create dürfte der falsche ort sein denn du kannst die Exe auch mit doppelklick öffnen um Dinge anzuzeigen etc. Zu dem Zeitpunkt sind also mit hoher Wahrscheinlichkeit Handles offen.

gsh 13. Sep 2006 10:50

Re: Mit Service auf Desktop zeichnen
 
Zitat:

Zitat von SirThornberry
Hast du denn, wie ich es geschrieben hab, das ganze in einen Thread ausgelagert? Das Create dürfte der falsche ort sein denn du kannst die Exe auch mit doppelklick öffnen um Dinge anzuzeigen etc. Zu dem Zeitpunkt sind also mit hoher Wahrscheinlichkeit Handles offen.

Des mit dem in einem Thread auslageren muss ich überlesen haben. Naja k ich habs jetzt jedenfalls in einem thread ausgelagert und nun funktioniert SetThreadDesktop schon mal.

Nur die Form wird immer noch nicht angezeigt.
Das Problem ist glaub ich des er irgendwie nach dem show abstirbt:
Delphi-Quellcode:
if SetThreadDesktop(lDesktop) then
begin
  Log('Erzeuge Form');//Wird ausgeführt
  Form1 := TForm1.Create(nil);//Wird ausgeführt
  Form1.Show;//Wird ausgeführt
  Log('Form wurde erzeugt');//Wird NICHT ausgeführt
end;
Aber warum solltet beim create schon handels offen sein?

SirThornberry 13. Sep 2006 10:56

Re: Mit Service auf Desktop zeichnen
 
weil das bei dem serviceobject wohl so ist. Das dein Form nicht angezeigt wird liegt dann daran das du in dem Thread keine Nachrichtenschleife hast. Im Haupttrhead wird diese durch Application.Run angeschuppst. Aber das ist ein anderes Thema und hat nichts mit dem Zeischnen auf den Desktop von einem Service aus zu tun (denn anstelle das Form anzuzeigen kannst du ja auf dem Desktop zeischnen).

gsh 13. Sep 2006 11:02

Re: Mit Service auf Desktop zeichnen
 
ne eine Nachrichten scheife hab ich nicht ... und wie mach ich die?

SirThornberry 13. Sep 2006 11:13

Re: Mit Service auf Desktop zeichnen
 
Wie du die machst findest du über die Suche (NonVCL). Allerdings ist die VCL nicht Threadsicher und arbeitet auch in Threads nicht ordentlich/Fehlerfrei.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:15 Uhr.
Seite 3 von 4     123 4      

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