Autor Beitrag
sky21
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mo 06.04.09 15:23 
Hi all

Meine Applikation ändert die Windows Registry. Damit die Änderung wirksam wird, muss das Betriebssystem (Windows XP) neu gestartet werden. Wann und wie neu gestartet wird, wird dem Benutzer überlassen und braucht hier auch nicht diskutiert zu werden. Meine Applikation soll allerdings erst "weitermachen", wenn das System neu gestartet wurde.

Mein Ansatz wäre jetzt, dass ich in die Registry irgendwo ein Key/Value schreibe (value = Now-Zeitstempel T1). Wird meine Applikation neu gestartet, wird dieser Wert ausgelesen und danach der Startzeitpunkt(T2) vom Betriessystem ermittelt. Ist T1 > T2 dann ist gut.

Ich frage mich jetzt, ob nicht Windwos selber eine Kontroll-Möglichkeit bietet (sprich: Vorgesehenes Flag setzen/auslesen), welches für solche Bedürfnisse gebraucht werden könnte.

Danke für eure Hilfe!
Hidden
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2242
Erhaltene Danke: 55

Win10
VS Code, Delphi 2010 Prof.
BeitragVerfasst: Mo 06.04.09 15:31 
Hi :)

Wenn deine Änderungen an der Registry erst nach einem Systemneustart wriksam werden, könntest du dann nicht prüfen, ob die Änderungen schon aktiv sind? Also quasi bei der Ursache ansetzen.

mfG,

_________________
Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
sky21 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mo 06.04.09 15:50 
Sehr gute idee.
sky21 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Di 07.04.09 08:22 
user profile iconsky21 hat folgendes geschrieben Zum zitierten Posting springen:
Sehr gute idee.

Hmmm, das könnte eventuell doch zu einem Problem werden. Siehe mein anderer Thread hier:www.delphi-forum.de/...WindowsXP_91491.html
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Di 07.04.09 08:54 
Du könntest dein Programm erstmal beenden, es muss sich aber merken dass es nicht mehr ohne neustart ausgeführt werden kann, und dann wie hier(www.delphi-library.d...s+starten_31484.html) beschrieben, nach dem Neustart mit irgendeinen Parameter aufrufenlassen, danach könnte sich das program merken das es wieder normal gestartet werden kann
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 07.04.09 12:03 
ok, wie wärs mit:

Programm sich selbst in den Autostartordner schreiben lassen,
danach beenden.

Beim nächsten start (kann man überprüfen, ob es vom Benutzer oder Autostart gestartet wurde?) wieder aus dem Ordner ausschreiben...

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Di 07.04.09 12:12 
Für sowas gibt's RunOnce in der Registry

Ferner: Schau doch lieber nach APIs von Windows, die nicht beim Prozessende Ressourcen freigeben. IIRC gab es eine Funktion zum Registrieren benannter Windows-Nachrichten. Diese bleiben bis zum nächsten Reboot erhalten. Problem: Man kann (offiziell) nicht ermitteln, ob eine solche Nachricht bereits registriert ist; man bekommt einfach die bereits registrierte, ODER einen neuen, falls noch nicht vorher registriert. Hier müsste man also ggf. mal kurz was zusammenhooken ;-)

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
sky21 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 141

W7
D2010, XE2
BeitragVerfasst: Mi 08.04.09 23:23 
hmmm nein nein nein, das führt nicht in die gewünschte Richtung. Ich möchte nichts mit Autostart zu tun haben ;-) Danke trotzdem für die bisherigen Beiträge.

Ich stelle nochmals die Frage:
Wie erkenne ich mit meinem Programm, ob zwischen dem letzen Programmstart und dem neuen Programmstart ein Windows reboot gemacht wurde? Da muss es doch einen Schalter (genauer: Event) von Windwos selber geben, dasman setzen kann und beim reboot wird dieses Event dann wieder zurückgesetzt ...

In meinem ersten Beitrag habe ich selber vorgeschlagen, einen Marker mittels Zeitstempel zu verwenden. Das finde ich mittlerweile nicht gut, da das zeitliche Kriterium mir zu heikel ist (-> Verstellbar)
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 09.04.09 09:05 
WMI:
Win32_OperatingSystem','LastBootUpTime'

oder so:

ausblenden Delphi-Quelltext
1:
PowerUptime.Caption:= IntToStr(GetTickCount div 60000)+ ' Minutes';					


oder so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
function powerUpTime: string;
const
  ticksperday: cardinal    = 1000 * 60 * 60 * 24;
  ticksperhour: cardinal   = 1000 * 60 * 60;
  ticksperminute: cardinal = 1000 * 60;
  tickspersecond: cardinal = 1000;
var
  t:  Longword;
  d, h, m : cardinal;
begin
  t := GetTickCount;

  d := t div ticksperday;
  Dec(t, d * ticksperday);

  h := t div ticksperhour;
  Dec(t, h * ticksperhour);

  m := t div ticksperminute;

  Result := IntToStr(d) + ' Days   ' + IntToStr(h) + ' Hours   ' + IntToStr(m) +
    ' Minutes ';
end;