Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Service als Konsolenanwendung vor Login (https://www.delphipraxis.net/66499-service-als-konsolenanwendung-vor-login.html)

Angel4585 30. Mär 2006 14:35


Service als Konsolenanwendung vor Login
 
Hallo zusammen,

also ich hab je schon vor ein paar Monaten was mit Serviceanwendungen gemacht und damals hieß es, dass es sehr kritisch ist wenn ich Formulare usw. anzeigen lasse.

ist das bei Konsolenanwendungen genauso kritisch? Welche Einschränkungen habe ich bei Konsolen gegenüber Formularanwendungen, ausser der Optik?

MfG Angel4585

Luckie 30. Mär 2006 14:41

Re: Service als Konsolenanwendung vor Login
 
Genau das selbe. Die Konsole wird auf dem Desktop vom Service angezeigt und der liegt in der WindowsStation des Services und die ist eben nicht die selbe wie die des Loginprozesses bzw. des interaktiven Benutzers.

Angel4585 30. Mär 2006 14:44

Re: Service als Konsolenanwendung vor Login
 
Und wie bekomme ich dann am besten eine Anzeige hin? :gruebel:

Konsole und Formulare sind ja schonmal ausgeschlossen wenn ich das richtig vertehe.

sakura 30. Mär 2006 14:45

Re: Service als Konsolenanwendung vor Login
 
Du baust eine zweite Anwendung, welche dann über Messages (welche Art auch immer Du willst) kommuniziert und so die wichtigen Daten austauscht.

...:cat:...

Angel4585 30. Mär 2006 14:50

Re: Service als Konsolenanwendung vor Login
 
ja aber ne Anzeige bekomm ich ja trotzdem nicht hin oder?

Sinnn ist folgender:

Eine Serveranwendung, die auch wenn man nicht eingeloggt ist Daten abgleicht, um zu sehen was abgeglichen wird brauche ich eine Anzeige, auch VOR dem Login.

Wenn ich ne zweite Anwendung baue die aufgerufen wird, wird die aber erst NACH dem Login angezeigt.

Edit: Wäre es möglich aus dem Dienst heraus mit Canvas zu zeichnen und so ne Anzeige hinzubekommen?

Luckie 30. Mär 2006 19:35

Re: Service als Konsolenanwendung vor Login
 
Zitat:

Zitat von Angel4585
Edit: Wäre es möglich aus dem Dienst heraus mit Canvas zu zeichnen und so ne Anzeige hinzubekommen?

Du hast es nicht verstanden oder? Was meinst du was für ein DC du bekommst mit GetDC, wenn du die Funktion mit dem Serevice aufrufst?

Du könntest mit MSDN-Library durchsuchenSwitchDesktop versuchen ein Fenster auf den entsprechenden Desktop zu legen. Aber wie du das machst, dass werden dir wohl nur sehr wenige erklären können und ich gehöre nicht dazu.

SirThornberry 30. Mär 2006 19:53

Re: Service als Konsolenanwendung vor Login
 
Luckie hat eigentlich schon die Lösung gepostet. Du musst mit Hilfe von SwitchDesktop einen Thread in einen anderen Desktop bringen und dort kannst du dann das neue Fenster erstellen.

Luckie 30. Mär 2006 20:03

Re: Service als Konsolenanwendung vor Login
 
So einfach ist es nicht. Er muss nicht nur auf einen anderen Desktop, sondern wahrscheinlich auch in eine andere WindowsStation. Nur den Desktop wechseln ist kein Problem: http://www.michael-puff.de/Developer...chDesktop.html

SirThornberry 30. Mär 2006 20:06

Re: Service als Konsolenanwendung vor Login
 
zum wechseln der WindowStations gibt es auch die entsprechenden Befehle. Aber einfach ist es wahrlich nicht. Jedoch denke ich auch das es nicht unmöglich ist wenn man es wirklich will und sich damit auseinander setzt.

Werd mich wenn ich zeit hab auch mal damit befassen einfach um zu sehen ob es vielleicht doch unmöglich ist. Das Hauptproblem welches ich sehe ist ein VCL-Formular in einem anderen Thread laufen zu lassen. Es wird wohl darauf hinaus laufen dass, das form welches beim login sichtbar sein soll auf nonvcl-basis läuft.

Angel4585 3. Apr 2006 07:27

Re: Service als Konsolenanwendung vor Login
 
@Luckie:

Also diese Switch Desktop geschichte ist ja krass, aber irgendwie wird bei mir diese MessageBox nicht angezeigt. Und das aus einen ganz normalen Programm. Muss ich da irgendwas beachten damit das angezeigt wird?
:gruebel:

Luckie 3. Apr 2006 07:33

Re: Service als Konsolenanwendung vor Login
 
LOL, bei mir auch nicht und habe mich somit selber ausgesperrt. :mrgreen:

In einer Konsolenanwendung het es aber. Muss ich mir mal angucken.

Angel4585 3. Apr 2006 07:45

Re: Service als Konsolenanwendung vor Login
 
Also ich bin auf Abmelden, dann hat der Debugger gefragt ob ich beenden will und dann auf abbrechen, dann war ich wieder zurück auf dem alten Desktop :stupid:

Edit: hab jetzt mal versucht aus der Konsole raus en Formular anzuzeigen und da hab ich mich auch wieder ausgesperrt.. ohne gehts aber. Was ist en ner MessageBox anders als an einem Formular?

Edit2: Also das Problem scheint die Unit "Forms" zu sein, sobald ich diese einbinde schliess ich mich aus... :(

Edit3: Also ich kann jetzt mit Canvas auf diesen zweiten Desktop zeichnen, aber könnte ich diesen zweiten Desktop nicht vielleicht auch irgendwie als eine Art Fenster auf dem ersten Desktop anzeigen lassen?

Angel4585 3. Apr 2006 08:58

Re: Service als Konsolenanwendung vor Login
 
Also theoretisch müsste doch, wenn ich auf den zweiten Desktop switche und dann mit Shellexecute ein Programm starte, dieses Programm auf ddiesem zweiten Desktop zu sehen sein, oder?

Auf jedenfall geschieht das nicht. Das programm wird auf dem ersten Desktop angezeigt... :(

Edit: Also ich hab jetzt mal den "Ernstfall" getestet:

Ein Dienst(TService) welcher den Desktop switcht und mit Canvas darauf die Uhrzeit anzeigt.

Funktioniert NICHT. Er switcht zwar den Desktop und wartet die 20 Sekunden, aber das Canvas wird nicht gezeichnet, hier der Code:

Delphi-Quellcode:
procedure TTestServerDienst.BaitAndSwitchDesktop;
var
  OldDesk     : HDESK;
  NewDesk     : HDESK;
  Canvas : TCanvas;
  DC : HDC;
begin
  OldDesk := GetThreadDesktop(GetCurrentThreadID);
  NewDesk := CreateDesktop(PChar('Foobar'), nil, nil, 0, DESKTOP_CREATEWINDOW or
    DESKTOP_SWITCHDESKTOP or DESKTOP_CREATEMENU, nil);
  if NewDesk <> 0 then
  begin
    SetThreadDesktop(NewDesk);
    Windows.SwitchDesktop(NewDesk);
    //DrawPicture('E:\Bild_2.bmp');
    ATestTime:=IncSecond(Now,20);
    try
     Canvas := TCanvas.Create();
      try
       try
          Canvas.Handle := DC;
          with canvas.Font do
           begin
           Size:=96;
           Color:=clRed;
           end;
         while (ATestTime > Now)and not Terminated do
          Canvas.TextOut(100,800,DateTimetoStr(ATestTime));
       except
        end;  
        finally
          Canvas.Free;
        end;
      finally
        ReleaseDC(0, DC);
      end;
    Windows.SwitchDesktop(OldDesk);
    SetThreadDesktop(OldDesk);
    CloseDesktop(NewDesk);
  end;
  CloseDesktop(OldDesk);
end;
{******************************************************************************}
procedure TTestServerDienst.ServiceExecute(Sender: TService);
begin
ATestTime:=IncMinute(Now,2);
while (ATestTime>Now)and not terminated do
 BaitAndSwitchDesktop;
end;
Was muss ich ändern?

Angel4585 4. Apr 2006 08:28

Re: Service als Konsolenanwendung vor Login
 
Also ich schaff es jetzt zumindest vor dem Login mit Canvas auf den neuen Desktop zu zeichnen, das problem ist jetzt nur, dass der alte Desktop nichtmehr zurück kommt.. heisst: Ich kann mich nichtmehr einloggen.. nurnoch übern abgesicherten Modus.

SirThornberry 4. Apr 2006 20:32

Re: Service als Konsolenanwendung vor Login
 
also das beschriebene problem mit den Desktops hab ich bisher nur beobachtet wenn der Desktop nicht richtig geöffnet wurde. Du kannst ja mal meinen Desktopswitch probieren ob der richtig zwischen den Desktops hinn und her springt. Wenn der richtig funktioniert liegt es eindeutig daran das der Zieldesktop nicht mit genügend Zugriffsrechten geöffnet wurde.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:27 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