![]() |
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. |
Re: Mit Service auf Desktop zeichnen
Keinen Bock es zu schicken oder ist es was von deiner Firma?
|
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:
![]() 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. |
Re: Mit Service auf Desktop zeichnen
ok ich glaub ich weiss jetzt mein Problem
Delphi-Quellcode:
aber warum? Ich hab des jetzt testweiße im ServiceCreate aufgerufen, also als allererstes. :wall:
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; |
Re: Mit Service auf Desktop zeichnen
*push*
|
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.
|
Re: Mit Service auf Desktop zeichnen
Zitat:
Nur die Form wird immer noch nicht angezeigt. Das Problem ist glaub ich des er irgendwie nach dem show abstirbt:
Delphi-Quellcode:
Aber warum solltet beim create schon handels offen sein?
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; |
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).
|
Re: Mit Service auf Desktop zeichnen
ne eine Nachrichten scheife hab ich nicht ... und wie mach ich die?
|
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 10:28 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