Entwickler-Ecke

Windows API - Restart vor Login


Klabautermann - Di 02.09.03 11:15
Titel: Restart vor Login
Hallo,

ich habe das Problem, das ein von mir geschriebener Service, unter bestimmten Umständen das Sytem neu Starten muss.
Leider funktioniert diese [http://www.delphi-forum.de/viewtopic.php?t=8272] Funktion zu dem Zeitpunkt noch nicht. Hat jemand eine Idee wie ich das trotzdem hinbekomme?

Gruß
Klabnautermann


Terra23 - Di 02.09.03 13:35

Warum geht das nicht? Poste doch mal etwas Code. :-)

Solltest du als Mod doch schon wissen.. ;-)


Delete - Di 02.09.03 17:41

Ist die User32.dll zu dem Zeitpunkt noch nicht geladen?

Probier sie doch mal selber zu laden und die Funktion dynamisch zu importieren.


Klabautermann - Mo 08.09.03 14:39

Hallo Leute,

so jetzt bin ich endlich mal dazu gekommen ein paar Experimente zu machen.

Also
1. Ich verwende Exakt den hier [http://www.delphi-forum.de/viewtopic.php?t=8272] vorgastellten Code für den Neustart.

2. Der Code funktuiniert auch auf auf "Standart" Systemen (hat sich ducrch Experimente ergeben).

3. Er funktioniert nicht, wenn Novell Netware installiert ist. Also blockt scheinbar deren Software (NWGINA??) den Neustart. Leider ist dies aber auf den Zielsystemen enthalten.

Luckie hat folgendes geschrieben:
Ist die User32.dll zu dem Zeitpunkt noch nicht geladen?

Die wird ja in der Windows.pas Implementiert.

Delphi-Quelltext
1:
function ExitWindowsEx; external user32 name 'ExitWindowsEx';                    

Wenn ich es selbst implementiere sähe das ja auch nicht anders aus.

Hat jemand von euch eine Idee, wie ich den Neustart aus meinem Service trotz Novell bekomme?

Gruß
Klabautermann


Delete - Mo 08.09.03 15:31

Ja, deklariert schon, nur ist sie zu dem Zeitpunkt auch schon vom System geladen, das war ja die Frage.


Klabautermann - Mo 08.09.03 16:09

Hallo,
Luckie hat folgendes geschrieben:
Ja, deklariert schon, nur ist sie zu dem Zeitpunkt auch schon vom System geladen, das war ja die Frage.


das verstehe ich nciht ganz, (fehlen wohl DLL grundlagen).
Also wenn die DLL wie oben gezeigt eingebunden wird, dann wird sie doch Statisch geladen? Wenn sie geladen ist kann ich sie auch verwenden.

Was meinst du mit vom System geladen? Muss Windows die DLLs erst Freigeben? Wenn ja, wie stelle ich fest ob dies geschehen ist, bzw. wie sorge ich dafür das es geschieht?

Gruß
Klabautermann


Delete - Mo 08.09.03 16:19

Nein nicht freigeben. Wenn du selbst eien DLL geschrieben hast, dann mußt du sie entweder statisch einbinden oder dynmaisch mit LoadLibrary laden. Klar soweit? Bei Windows DLL's entfällt das laden, sofern sie standard DLL's sind wie die Kernel32, User32 und die GDI32.

Jetzt meine Frage: Hat Windows zu dem Zeitpunkt wo du die Funktion brauchst die entsprechende DLL schon geladen?

Allerdings, da sie von der windows.pas statisch eingebunden wird und es zu keinem Fehler kommt, müßte sie eigentlich geladen sein.


Klabautermann - Mo 08.09.03 16:34

Luckie hat folgendes geschrieben:
Nein nicht freigeben. Wenn du selbst eien DLL geschrieben hast, dann mußt du sie entweder statisch einbinden oder dynmaisch mit LoadLibrary laden.

Klar, aler sie wird ja Statisch in Windows.pas geladen. Das interessante an der Sache ist ja, das der Service (in welchen das ganze verwendet wird) auf einem Novell-Freien Windows 2000 durchaus einen neustart auslösen kann. Eine fehlerhafte implementierung ist dadurch im grunde ausgeschlossen. Sobald aber die Novell Software installiert ist, funktioniert der Neustart vor dem Login nicht mehr. Wenn an ihn in einer normalen Exe nach dem Login aufruft, geht es auch dort. Was könnte Novell also blocken, dass der Neutstart nciht möglich ist?


Luckie hat folgendes geschrieben:
Jetzt meine Frage: Hat Windows zu dem Zeitpunkt wo du die Funktion brauchst die entsprechende DLL schon geladen?

JA, das müsste es haben da 1. Stratisch eingebunden und 2. der Dienst in etwas anderer Umgebung (eben ohne Novell) fehlerfrei funktioniert.

Luckie hat folgendes geschrieben:
Allerdings, da sie von der windows.pas statisch eingebunden wird und es zu keinem Fehler kommt, müßte sie eigentlich geladen sein.

Das sehe ich auch so. Deshalb war ich durch die Nachfrage verwirrt.

Gruß
Klabautermann


Klabautermann - Di 09.09.03 10:49

Hallo,

noch mein Abschlussreport:

Ich habe keine Optimale lösung für dieses Problem gefunden, aber konnte eine Behelfslösung entwickeln. Diese sieht so aus:


Wenn jemand eine bessere lösung hat währe ich froh wenn er/sie diese nachreichen würde. Ansonsten wünsche ich jeden, der vor dem selben Problem steht viel Spass mit dieser Lösung.

Gruß
Klabautermann