System

Systemnahe Programmierung

 

Windows-Ordner ermitteln

Mit dem folgenden Code kann der Ordner ermittelt werden in dem sich die Systemdateien von Windows befinden:

 1 function GetWindowsDir: string;
 2 var
 3   Required                              : Cardinal;
 4   I                                     : Integer;
 5 begin
 6   Result := '';
 7   // zuerst die Gesamtlänge ermitteln
 8   Required := GetWindowsDirectory(nil, 0);
 9   if Required <> 0 then begin
10     SetLength(Result, Required);
11     // gesamten String, einschliesslich des schliessenden NULL bytes holen
12     GetWindowsDirectory(PChar(Result), Required);
13     // in einen "echten" Pascal String umwandeln
14     for I := 0 to Length(Result) - 1 do
15       if Result[I + 1] = #0 then begin
16         SetLength(Result, I);
17         Exit;
18       end;
19   end;
20 end;
 

Windows-Ordner für temporäre Dateien ermitteln

Mit dem folgenden Code kann der Ordner ermittelt werden in dem Windows temporäre Dateien ablegt:

  1 function GetWindowsTempFolder: string;
 2 var
 3   Required                              : Cardinal;
 4   I                                     : Integer;
 5 begin
 6   Result := '';
 7   // zuerst die Gesamtlänge ermitteln
 8   Required := GetTempPath(0, nil);
 9   if Required <> 0 then begin
10     SetLength(Result, Required);
11     // gesamten String, einschliesslich des schliessenden NULL bytes holen
12     GetTempPath(Required, PChar(Result));
13     // in einen "echten" Pascal String umwandeln
14     for I := 0 to Length(Result) - 1 do
15       if Result[I + 1] = #0 then begin
16         SetLength(Result, I);
17         Exit;
18       end;
19   end;
20 end;

 

Das System herunterfahren oder neu starten

Wenn Sie Ihren Rechner programmgesteuert herunterfahren oder neu starten wollen, können Sie den folgenden Code dazu verwenden. Bitte beachten Sie, dass dies unter Windows Vista mit aktivierter UAC nur funktioniert wenn das Programm mit Administratorrechten gestartet wurde!

 1 function WindowsDowner(flag: word): Boolean;
 2 var
 3   VInfo                                 : TOSVersionInfo;
 4   hToken                                : THandle;
 5   tp                                    : TTokenPrivileges;
 6   dw                                    : DWord;
 7 begin
 8   //
 9   //  Mögliche Werte für die Variable "flag":
10   //  EWX_LOGOFF      - Benutzer abmelden
11   //  EWX_SHUTDOWN    - Rechner sicher herunterfahren
12   //  EWX_REBOOT      - Rechner neu starten
13   //  EWX_FORCE       - Auswahl erzwingen (mit anderen "flag" Werten per OR kombinieren)
14   //  EWX_POWEROFF    - Rechner herunterfahren
15   //
16   Result := false;
17   VInfo.dwOSVersionInfoSize := SizeOf(VInfo);
18   GetVersionEx(VInfo);
19   if VInfo.dwPlatformId = VER_PLATFORM_WIN32_NT then begin {NT}
20     OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
21     LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tp.Privileges[0].Luid);
22     tp.PrivilegeCount := 1;
23     tp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
24     dw := 0;
25     AdjustTokenPrivileges(hToken, false, tp, 0, PTokenPrivileges(nil)^, dw);
26     CloseHandle(hToken);
27     Result := ExitWindowsEx(flag, 0);
28   end else begin                        // Win95/98
29     Result := ExitWindowsEx(flag, 0);
30   end;
31 end;
 

 

 

aktualisiert: 11.11.2009