Programmkompatibilitätsassistent in Windows Vista



  • Hallo.

    Ich habe eine Anwendung geschrieben, welche in Vista einige Einstellungen vornimmt. Und einige Dateien kopiert.
    Diese Anwendung soll nun unter Windows 2000, XP und Vista laufen.
    Da unter jedem OS die Pfade anders sind, muss ich nun die Betriebssystem-Version vor der Installation prüfen.

    Nun habe ich das Problem, dass Vista meint, die Installation wäre fehlgeschlagen (obwohl sie es nicht ist, sondern alles funktioniert hat):

    Programmkompatibilitätsassistent in Windows Vista - vorliegende Dokumentation
    Einführung in PCA
    Der Program Compatibility Wizard (Programmkompatibilitäts-Assistent) im Zubehör und der Kompatibilitäts-Reiter in den Dateieigenschaften sind nützliche Tools zur Behebung von Programmkompatibilitäts-Problemen unter Windows XP. Die Haupteinschränkung dieser Tools besteht in der Erkennbarkeit und der Tatsache, dass der Benutzer wissen muss, wann diese Tools anzuwenden sind Der „Program Compatibility Assistant (PCA)“ ist eine neue Funktion unter Windows Vista, die es ermöglicht, ältere Programme mit Kompatibilitätsproblemen automatisch besser laufen zu lassen. Wenn der PCA ein bekanntes Kompatibilitätsproblem erkennt, nachdem der Benutzer ein älteres Programm gestartet hat, informiert er denselben hierüber und bietet Lösungen an, die beim nächsten Start des Programms angewendet werden können.
    ....

    PCA-Szenarien
    Erkennung fehlgeschlagener Installation.
    Eines der Hauptszenarien für den PCA ist die Erkennung einer fehlgeschlagenen Installation unter Windows Vista und das Angebot der Anwendung des Windows XP-Kompatibilitätsmodus als Lösung.
    ....
    1.
    Wie stellt sich die Erkennungslogik dar und woher weiß der PCA, dass die Installation aufgrund von Versionsproblemen fehlgeschlagen ist?

    Der PCA sucht nicht speziell nach aufgrund von Versionsproblemen fehlgeschlagenen Installationen. Die von dem PCA genutzte Logik besteht in der Erkennung fehlgeschlagener Installationen. Der PCA überwacht ein als Installation unter Windows Vista erkanntes Programm und prüft, ob dasselbe einen Eintrag in „Add or Remove Programs (ARP)“ (Programme hinzufügen/entfernen) schreibt. Wenn kein Eintrag in ARP erfolgt, schließt der PCA daraus, dass die Installation nicht erfolgreich abgeschlossen wurde und wartet auf den Abbruch des Installationsvorgangs bevor die Benutzeroberfläche angezeigt wird.

    Frage:
    Wie unterbinde ich das?
    Ich hab ja nix zum de-installieren, bzw ein Eintrag unter Systemsteuerung -> Software ist nicht erwünscht.

    mfg
    trequ


  • Mod

    Was bekommst Du denn für eine Fehlermeldung? (in Detail!)
    Hast Du scheon ein Manifest fur die Zugriffsart angegeben? (asInvoker oder requireAdministrator siehe http://blog.m-ri.de/index.php/2006/12/12/vista-und-die-notwendigkeit-eines-manifestes-fur-die-uac/)
    Hat Dein Programm evtl. einen Exit-Code!=0?



  • Hallo,

    Martin Richter schrieb:

    Was bekommst Du denn für eine Fehlermeldung? (in Detail!)

    Programmkompatibilitätsassistent
    Das Programm XYZ wurde möglicherweise nicht richtig installiert.
    -> Das Programm mit den empfohlenen Einstellungen erneut installieren
    (Vista startet das Programm neu, und ihm wird eine Versionsnummer von 5.1 statt 6.0 gegeben (also XP statt Vista), wenn ich das Abfrage.
    Da alle Pfade unter XP aber ganz anders sind, geht das natürlich total in die Hose.)
    -> Das Programm wurde korrekt installiert

    Martin Richter schrieb:

    Hast Du scheon ein Manifest fur die Zugriffsart angegeben? (asInvoker oder requireAdministrator siehe http://blog.m-ri.de/index.php/2006/12/12/vista-und-die-notwendigkeit-eines-manifestes-fur-die-uac/)
    Hat Dein Programm evtl. einen Exit-Code!=0?

    Ja, das Manifest ist drin.
    Exit-Codes hab ich durchprobiert, egal was man ausgibt, Meldung kommt trotzdem.

    mfg
    trequ


  • Mod

    Soweit ich weiß untersucht/beobachtet der Programm-Kompatibilitäts Assistent nur was geschah kurz bevor ein Programm beendet wurde.
    Wenn also kurz vor dem Beenden das laden eine Typelib fehlschlug, und das programm danach beendet wird, dann wird solch ein Dialog angezeigt. Wie genau das funktioniert weiß ich noch nicht.

    Also irgendwas scheit fehlzuschlagen bevor Dein Programm beendet wird. Versucht Du etwas in die Registry zu schreiben (speziell HKLM)?
    Welchen Modus hast Du Deinem Programm gegeben? asInvoker?
    Was passiert wenn Du es als Admin startest?

    Allerdings verstehe ich Dein Probleme nicht. Wenn Du SHGetSpecialFolder... verwendest dann interessiert Dich doch der Aufbau der Verzeichnisse gar nicht!
    Was ist Dein Problem?



  • Martin Richter schrieb:

    Allerdings verstehe ich Dein Probleme nicht. Wenn Du SHGetSpecialFolder... verwendest dann interessiert Dich doch der Aufbau der Verzeichnisse gar nicht!
    Was ist Dein Problem?

    Das täte mich auch interessieren. Ich kümmere mich überhaupt nicht darum, wie die Pfade heißen.


  • Mod

    Nachtrag: IMHO dürfte der Programm Kompatibilitättsassistent nicht starten, wenn Du ein entsprechenes Manifest hast. Denn an diesem Manifest erkennt Vista, dass dieses Programm für Vista konzipiert wurde!



  • Hallo.

    Martin Richter schrieb:

    Soweit ich weiß untersucht/beobachtet der Programm-Kompatibilitäts Assistent nur was geschah kurz bevor ein Programm beendet wurde.
    Wenn also kurz vor dem Beenden das laden eine Typelib fehlschlug, und das programm danach beendet wird, dann wird solch ein Dialog angezeigt. Wie genau das funktioniert weiß ich noch nicht.

    Wie ich oben bereits gepostet habe:
    Aus der MSDN:

    1. Wie stellt sich die Erkennungslogik dar und woher weiß der PCA, dass die Installation aufgrund von Versionsproblemen fehlgeschlagen ist?

    Der PCA sucht nicht speziell nach aufgrund von Versionsproblemen fehlgeschlagenen Installationen. Die von dem PCA genutzte Logik besteht in der Erkennung fehlgeschlagener Installationen. Der PCA überwacht ein als Installation unter Windows Vista erkanntes Programm und prüft, ob dasselbe einen Eintrag in „Add or Remove Programs (ARP)“ (Programme hinzufügen/entfernen) schreibt. Wenn kein Eintrag in ARP erfolgt, schließt der PCA daraus, dass die Installation nicht erfolgreich abgeschlossen wurde und wartet auf den Abbruch des Installationsvorgangs bevor die Benutzeroberfläche angezeigt wird.

    Mein Programm kopiert Dateien und erstellt Registry Keys.
    Aber es erstellt KEINEN Eintrag unter "Add or Remove Programs".
    Daher vermute ich, dass es als fehlgeschlagene Installation erkannt wird.
    Lasse ich den Teil mit den Registry Keys weg, tritt das Problem nicht auf.

    Also irgendwas scheit fehlzuschlagen bevor Dein Programm beendet wird.

    Ich kann nichts finden, das nicht funktioniert.
    Es ist nur die Meldung, welche unabhängig vom Exit-Code erscheint.
    An sonsten tut das Programm was es soll, nur diese Meldung ist halt noch ein Bug.

    Versucht Du etwas in die Registry zu schreiben (speziell HKLM)?

    Das Programm arbeitet etwa so:

    Das Programm hat 2 Buttons:
    Wenn Button 1 gedrückt wird, dann...
    ... kopiere 5 Dateien nach [GetWindowsDirectory()...]
    ... durchsuche (mit 20 tollen If-then While next key - schleifen) HKLM\SYSTEM\... nach dem richtigen Laufwerk
    ... erstelle für dieses Laufwerk neue Einträge in HKLM\SOFTWARE\Windows\CurrentVersion...

    Wenn Button 2 gedrückt wird, dann...
    ... entferne evtl vorhanden Einträge unter HKLM\SOFTWARE\Windows\CurrentVersion...

    Welchen Modus hast Du Deinem Programm gegeben? asInvoker?

    Ja.

    Was passiert wenn Du es als Admin startest?

    Keine Änderung.

    Allerdings verstehe ich Dein Probleme nicht. Wenn Du SHGetSpecialFolder... verwendest dann interessiert Dich doch der Aufbau der Verzeichnisse gar nicht!
    Was ist Dein Problem?

    Die Struktur des Hardware-Enumerators ist unterschiedlich:
    1. Muss ich, abhängig vom OS, die Hardware-Registry-Keys anders durchsuchen
    2. Muss ich die Registry Keys abhängig vom Betriebsystm setzen
    3. Muss ich irgendwie vermeiden, dass unter Windows Vista 64Bit ich unter \WoW32\CurrentControlSet\.. lande.

    Nachtrag: IMHO dürfte der Programm Kompatibilitättsassistent nicht starten, wenn Du ein entsprechenes Manifest hast. Denn an diesem Manifest erkennt Vista, dass dieses Programm für Vista konzipiert wurde!

    So weit ich weiß, bezieht sich das Manifest darauf, ob ein Programm als Benutzer oder als Admin ausgeführt wird.
    Und da ich IMMER Admin-Rechte brauche (Sonst kann das Prog ja net nach C\Windows schreiben) hab ich ein Manifest drin.

    mfg
    trequ


  • Mod

    Was mir aufgefallen ist: Du schreibst Du nutzt asInvoker. Das ist inkorrekt. Als Installations Programm solltest Du requiresAdministrator setzen.

    Welchen Namen hat Dein Programm? Irgendwas mit Setup oder Install?
    Daran wird ein Installationsprogramm erkannt.

    Die Guidlines für Vista erzwingen den Eintrag in die Liste der installierten Programme. Ich vermute einfach die Logik:
    Installationsprogramm läuft, danach ist kein Eintrag in der Programmliste vorhanden == Fehlerhafte Installation führt dazu!

    Es hindert Dich doch nichts einen solchen Eintrag zu erzeugen. Was passiert dann?



  • Hallo.

    Martin Richter schrieb:

    Was mir aufgefallen ist: Du schreibst Du nutzt asInvoker. Das ist inkorrekt. Als Installations Programm solltest Du requiresAdministrator setzen.

    Ok, mal testen.
    Was mir wirklich mal weiterhelfen würde, wäre eine genaue Anleitung, wie man in MS Visual C++ 6.0 ein Manifest einbindet.
    Es gibt zwar verschiedene Anleitungen, welche irgendwas vom erstellen und umbenennen einer .rc Datei erzählen, aber so richtig weiß ich nicht ob das jetzt alles richtig war.
    Eine Anleitung geht von Visual Studio 2005 aus, die nächste arbeitet mit notepad... ?
    Da man nur eine .rc Datei haben kann, weiß ich net so recht, ob das alles richtig ist, was ich da mache.
    Ich hatte vorher immer Zugriffsverletzungen und "Zugriff verweigert", beim Versuch, in die Registry zu schreiben.
    Seid ich am Manifest gebastelt habe, ist das jetzt weg, Vista fragt brav beim Programmstart nach, aber so richtig sicher bin ich mir damit nicht...

    Welchen Namen hat Dein Programm? Irgendwas mit Setup oder Install?
    Daran wird ein Installationsprogramm erkannt.

    Ja. ich werde das mal ändern und sehen was passiert

    Die Guidlines für Vista erzwingen den Eintrag in die Liste der installierten Programme. Ich vermute einfach die Logik:
    Installationsprogramm läuft, danach ist kein Eintrag in der Programmliste vorhanden == Fehlerhafte Installation führt dazu!

    Es hindert Dich doch nichts einen solchen Eintrag zu erzeugen. Was passiert dann?

    Nun... eine Deinstallation ist nicht vorgesehen.
    Was sollte ich da eintragen?
    Wenn ich was eintrage, dann ist ja ein Eintrag für eine Deinstallation vorhanden.


  • Mod

    Wie ich das verstehe macht Dein Programm doch eine Art Deinstallation wenn der "zweite Schalter" angeklickt wird.

    Ein Manifest einfügen ist das einfachste von der Welt:
    Neue benutzerdefinierte Ressource anlegen. Namen RT_MANIFEST geben, anschließend die ID der Ressource über einen define oder direkt so einstellen das sie 1 ist.

    Der Inhalt steht in meinem Blog. Das habe ich ja schon geschrieben!

    Ich gehe mal davon aus, dass dies das Hauptübel ist, da sonst die UAC davon ausgeht dass Dein Programm nichts von Vista weiß!


Anmelden zum Antworten