Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Herausfinden ob eigene App im Windows XP Modus läuft (https://www.delphipraxis.net/155540-herausfinden-ob-eigene-app-im-windows-xp-modus-laeuft.html)

DevidEspenschied 27. Okt 2010 19:40

Herausfinden ob eigene App im Windows XP Modus läuft
 
Hallo,

ich suche eine Möglichkeit, um innerhalb meiner Delphi-Applikation herauszufinden, ob sie gerade im Windows XP-Modus von Windows 7 läuft.

Das hat nichts mit den Kompatibilitätseinstellungen zu tun, die nach einem Rechtsklick auf einer EXE-Datei im gleichnamigen Karteireiter zu finden sind. Für diese frage ich die Umgebungsvariable "__COMPAT_LAYER" ab, und das funktioniert auch zuverlässig.

Der Windows XP-Modus setzt diese Variable aber nicht, weswegen ich nach anderen Wegen suche, das abzufragen.

Bin über jeden Vorschlag dankbar.

himitsu 27. Okt 2010 19:49

AW: Herausfinden ob eigene App im Windows XP Modus läuft
 
Der Windows 7 XP-Modus ist eine VM (virtuelle Maschine, welche im VirtualPCläuft) ... es läuft also ein richtiges Windows XP im Hintergrund.
Alles was darin läuf, ist in gewisser Weise vom Hautsystem abgekapselt, weswegen dort auch nicht alles verfügbar ist, wie z.B. solche Umgebungsvariablen.

Der Kompatibilitätsmodus ist 'ne Art Sandbox, welche z.B. ein XP-System vorgaugelt, alles aber im Win7 laufen läßt.

idefix2 27. Okt 2010 19:59

AW: Herausfinden ob eigene App im Windows XP Modus läuft
 
Wenn Du nach der Version des betriebssystems abfragt, meldet dir Win7 Win7, wenn das Programm im XP Modus läuft, meldet es WinXP.

Von einem reinen XP wirst Du es nicht leicht unterscheiden können, denn die virtuelle Maschine läuft ja wirklich unter einem echten WinXP Betriebssystem, auch wenn das Host System Windows 7 ist.

Bummi 27. Okt 2010 21:36

AW: Herausfinden ob eigene App im Windows XP Modus läuft
 
Ich habe hier noch eine Fetzen Uraltcode, keine Ahnung ob der für den neuen VirtualPC in Win7 noch passt...
Delphi-Quellcode:

// running in Virtaul PC
function running_inside_vpc: boolean; assembler;
asm
  push ebp

  mov ecx, offset @@exception_handler
  mov ebp, esp

  push ebx
  push ecx
  push dword ptr fs:[0]
  mov dword ptr fs:[0], esp

  mov ebx, 0 // flag
  mov eax, 1 // VPC function number

  // call VPC
  db 00Fh, 03Fh, 007h, 00Bh

  mov eax, dword ptr ss:[esp]
  mov dword ptr fs:[0], eax
  add esp, 8

  test ebx, ebx
  setz al
  lea esp, dword ptr ss:[ebp-4]
  mov ebx, dword ptr ss:[esp]
  mov ebp, dword ptr ss:[esp+4]
  add esp, 8
  jmp @@ret
  @@exception_handler:
  mov ecx, [esp+0Ch]
  mov dword ptr [ecx+0A4h], -1 // EBX = -1 -> not running, ebx = 0 -> running
  add dword ptr [ecx+0B8h], 4 // -> skip past the detection code
  xor eax, eax // exception is handled
  ret
  @@ret:
end;


// running in VMWare
function IsVMwarePresent(): LongBool; stdcall; // platform;
begin
  Result := False;
 {$IFDEF CPU386}
  try
    asm
            mov    eax, 564D5868h
            mov    ebx, 00000000h
            mov    ecx, 0000000Ah
            mov    edx, 00005658h
            in     eax, dx
            cmp    ebx, 564D5868h
            jne    @@exit
            mov    Result, True
    @@exit:
    end;
  except
    Result := False;
  end;
{$ENDIF}
end;

DevidEspenschied 28. Okt 2010 14:18

AW: Herausfinden ob eigene App im Windows XP Modus läuft
 
Ich habe noch einen weiteren Weg gefunden, abzufragen ob der Windows XP Mode aktiv ist. Und zwar ist der Computer lizenziert für einen Benutzer namens "Windows XP Mode". Der Nachteil ist hier allerdings, dass ich per Regedit diesen Wert ändern und damit die Prüfung austricksen kann. Von daher wäre der von Bummi gepostete Code vielleicht effektiver, insofern er denn funktioniert. Das werde ich heute mal testen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:57 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 by Thomas Breitkreuz