Kompatibilitätsmodus erzwingen?

  • Habe mit einem meiner Scripte das Problem, dass es unter Win7 nur fehlerfrei läuft wenn man es im Vista Kompatibilitätsmodus ausführt. Kann man beim kompilieren evtl. schon dafür sorgen, dass das Betriebssystem beim Aufruf der exe automatisch den Kompatibilitätsmodus verwendet? Wenn man die Einstellung manuell beim ersten Aufruf vornimmt wird das scheinbar irgendwo gespeichert. Allerdings kann ich natürlich von meinen Usern nicht erwarten, dass jeder in der Lage ist den Kompatibilitäsmodus selbst zu wählen. Um genauzusein ist die besagte exe Datei ohnehin nur ein ausgelagertes Teilscript das vom User selbst nicht gestartet werden kann/soll. Wenn es also möglich ist den Kompatibilitäsmodus über den run() Befehl zu erzwingen würde mir das auch schon genügen.

    Jenachdem welche Möglichkeiten es gibt müsste evtl. auch gewährleistet sein, dass das Script auch auf anderen Betriebssystemen wie XP lauffähig ist. Deswegen wäre wohl auch noch eine Abfrage welches Betriebssystem der User verwendet notwendig.

    Jemand Tipps wie ich sowohl den Kompatibilitätsmodus erzwingen als auch zuverlässig das verwendete Betriebssystem ermitteln kann?

    Einmal editiert, zuletzt von misterspeed (15. November 2010 um 16:25)

  • Hey
    Soweit ich weiß, kann man das nicht machen was du willst.
    Du kannst aber eine Start.exe machen, die die Program.exe aufruft mit einer Komplitätsoption (keine Ahnung wie man das machen kann). In der Start.exe wird dann wie autobert schon sagte die optimale Einstellung herausgefunen und dann mit diesen Einstellungen die Program.exe aufgerufen (Run).
    MfG AntiSpeed

    Nur keine Hektik - das Leben ist stressig genug

  • die die Program.exe aufruft mit einer Komplitätsoption (keine Ahnung wie man das machen kann)

    Ja genau das war doch die Frage. ^^

    Dass ich vorher natürlich das OS ermitteln sollte und das problematische Programm dann per run Befehl ausgeführt werden muss ist klar, bzw bereits so eingerichtet. Nur nuzt das wenig, solange ich nicht erreichen kann, dass Windows den Kompatibilitätsmodus benutzt, sofern die entsprechende OS Version nicht nativ in Benutzung ist.

    Unter Vista und vermutlich auch XP läuft das ganze problemlos, allerdings wie gesagt unter Win7 nicht stabil. Um genauzusein geht es um eine eingebettete FF Instanz, die jedesmal dann abstürzt wenn Tabs geöffnet werden. Führt man dieses Programm im Kompatibilitätsmodus für Vista aus kommt es zu keinem Absturz der eingebetteten FF Instanz, somit kann ich Fehler am Programm selbst ausschliessen. Irgendwo speichert Windows welche exe Dateien im Kompatibilitätsmodus ausgeführt werden sollen, denn wenn ich die exe neukompiliere bleibt die Einstellung die ich zuvor per Hand erledigt habe erhalten. Ich vermute es gibt Registry Einträge in dennen dies gespeichert wird.

  • Das schaut doch schonmal gut aus. Gibt es irgendwo eine komplette Liste welche Werte __COMPAT_LAYER haben darf/kann ?
    Die verlinkte Microsoft Seite bezieht sich leider noch auf WinXP. Hab jetzt schon ne Weile gegoogelt, aber wirklich vollständige Listen die sich auf Vista, Win7 und Win 2008R2 beziehen hab ich nicht gefunden.
    Da je nach Betriebssystem unterschiedliche Kompatibilitäts Modi zur Verfügung stehen wären vollständige Listen pro Betriebssystem schon wichtig.

  • Moin!
    Ich hatte mal ein XP Programm auf Win7 nicht zum laufen bekommen, musste eben den XP Kompitabilitätsmodus einschalten. Und das so:
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", @scriptdir & "\Shock2.exe", "REG_SZ", "WINXPSP2 RUNASADMIN")
    Und statt 'WINXPSP2' musste mal 'WINVISTA' probieren, vielleicht klappt es ja damit!

    Grüsse!

  • Danke, hatte den Schlüssel in der Registry kurz vor deinem Posting auch gefunden. Da ich mit Autoit noch nie was in der Registry gemacht habe hätte ich noch eine Frage. Benötigt man Admin Privilegien um Einträge unter current_user zu erstellen oder ist das auch mit User Berechtigung möglich?

    EDIT: Scheinbar gehts auch mit User Berechtigung. Somit vielen Dank für euere Hilfe, klappt wunderbar.

    Hier zum Abschluss noch mein Test-Script:

    [autoit]


    if @OSVersion == "WIN_2008R2" or @OSVersion == "WIN_7" Then
    $checkRegEntry = RegRead ( "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", @scriptdir & "\test.exe")
    if $checkRegEntry == "" Then
    MsgBox(0,"","Registry key wird erstellt!")
    RegWrite("HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", @scriptdir & "\test.exe", "REG_SZ", "VISTASP2")
    Else
    ;MsgBox(0,"","Registry key wird gelöscht")
    ;RegDelete ( "HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers", @scriptdir & "\test.exe")
    EndIf
    Else
    MsgBox(0,"","Kompatibilitätsmodus wird nicht benötigt. OS Verison lautet: " & @OSVersion)
    EndIf

    [/autoit]

    Einmal editiert, zuletzt von misterspeed (15. November 2010 um 16:24)

  • Nope siehe Edit. Wurde unter win2008R2 mit einem Benutzer Account ohne Admin Rechte getestet. Macht auch Sinn, denn diesen Eintrag kann man auch per Hand über die Eigenschaften der exe Datei setzen. Vermutlich werden aber für gewisse Registry Zweige Admin Rechte benötigt. In diesem Fall scheinbar nicht.

  • Zitat

    HKEY_CURRENT_USER\Software\Mi

    warum sollte man hier auch Admin Rechte brauchen ????

    Achtung Anfänger! :whistling:

    Betrachten des Quellcodes auf eigene Gefahr, bei Übelkeit,Erbrechen,Kopfschmerzen übernehme ich keine Haftung. 8o

  • Win7... UAC... ich dachte immer das man zum ändern von Registryeinträgen eben Admin-Rechte benötigt....
    ...hab´s immer so gemacht; und wie ich schon meinte: Man(n) lernt nie aus!