Autor Beitrag
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Di 02.09.03 11:15 
Hallo,

ich habe das Problem, das ein von mir geschriebener Service, unter bestimmten Umständen das Sytem neu Starten muss.
Leider funktioniert diese Funktion zu dem Zeitpunkt noch nicht. Hat jemand eine Idee wie ich das trotzdem hinbekomme?

Gruß
Klabnautermann
Terra23
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 872

Win 8
Delphi 7
BeitragVerfasst: Di 02.09.03 13:35 
Warum geht das nicht? Poste doch mal etwas Code. :-)

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

_________________
Hasta La Victoria Siempre
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 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.
ausblenden 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:
  • Der Service macht was er immer machte, ändert also bei bedarf ein paar Regestry Schlüssel.
  • Hierdurch wird ein neustart benötigt, den der Service nciht leisten kann.
  • Deshlabt trägt er zusätzlich eine AdminAutoLogin ein und schreibt ein (Konsolen-)Programm in den RunOnce Schlüssel.
  • Da der Service vor dem Login Dialog (NWGina/MSGina) läuft werden diese änderungen sofort Aktiv und der Autologin (ohne neustart) durchgeführt.
  • Das RuneOnce Programm wird ausgeführt, löscht die Autologin Werte wieder und Rebootet das System (was jetzt, nach dem Login Problemlos funktioniert).


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