Die Community zu .NET und Classic VB.
Menü

FAQ 0159: Was muss bei der Verwendung von VB6 unter Windows Vista und neuer beachtet werden?

 von 

Frage 

Ab Windows Vista fallen Restriktionen, in welchen Verzeichnissen Dateien abgelegt werden können und dürfen, auf. Diese Restriktionen gibt es bereits ab Windows NT, aber bis Windows XP konnte der Entwickler diese Restriktionen nahezu beliebig umgehen.
Diese FAQ beleuchtet eine dieser Restriktionen und zeigt Wege, damit umzugehen.

Einleitung  

Die Installation von Visual Basic 6 kann unter Windows Vista und Windows 7 durchaus trickreich sein. Doch auch, wenn die eigentliche Installation gelungen ist, müssen noch ein paar Hindernisse umgangen werden, um einen reibungslosen Ablauf zu ermöglichen. Diese FAQ soll deshalb die notwendigen Schritte aufzeigen.

Die Installation  

Nachdem der Installationsdatenträger für VB6 eingelegt worden ist, sollte das Setup automatisch starten. Ist dies nicht der Fall, muss über manuelles Ausführen der Setup.exe nachgeholfen werden.
Bevor die Setup.exe startet, fordert Windows Vista und neuer einige Rechte dafür an, diese müssen über einen Klick auf "Zulassen" gewährt werden. Es folgt ein Dialog, der auf "bekannte Kompatibilitätsprobleme" hinweist. Dieser muss mit einem "Programm ausführen" quittiert werden. Anschließend kann die Installation wie gewohnt durchgeführt werden. Sobald erneut die Meldung bzgl. "bekannter Kompatibilitätsprobleme" erscheint, muss auch hier "Programm ausführen" angeklickt werden. Die Installation sollte daraufhin ohne weitere Probleme ablaufen.

Einstellungen vor dem ersten Start  

Die IDE von Visual Basic 6, bzw. genau genommen der Forms Designer, hat unter den neueren Windowsversionen leider das Manko, dass beim Aufziehen und Vergrößern/Verkleinern von Forms und Controls ein starkes Ruckeln entsteht. Dieses lässt sich durch das Abstellen von Windows Aero unterbinden. Wenn sie Aero nicht standardmäßig deaktivieren wollen, so können sie einstellen, dass es immer dann abgestellt wird, wenn sie die VB6-IDE starten:
Klicken sie dazu mit der rechten Maustaste auf eine Verknüpfung zur VB6.exe (beispielsweise Start -> Alle Programme -> Microsoft Visual Basic 6.0) und wählen sie im Kontextmenü den Punkt "Eigenschaften" aus. Auf dem sich öffnenden Dialog wechseln sie auf den Registerreiter "Kompatibilität" und setzen sie ein Häkchen vor die Einstellungen "Desktopgestaltung deaktivieren".

Wollen sie ihre Projektdateien zudem außerhalb des Ordners Eigene Dateien sichern (etwa unter C:\Programme\ oder auf dem Desktop), so müssen sie VB6 außerdem Administratorrechte gewähren. Setzen sie dazu im eben genannten Eigenschaftendialog ebenfalls ein Häkchen vor "Programm als ein Administrator ausführen". Wenn von nun an VB6 gestartet wird, erscheint immer zunächst ein Dialog, der Rechte für das Programm anfordert, die sie gewähren müssen, damit sie ihre Projektdateien in einem beliebigen Ordner ablegen können.

Was muss beim Entwickeln beachtet werden?  

Bei der Entwicklung für Windows Vista und neuer ist insbesondere die Einschränkung der Benutzerrechte zu beachten. So ist es nun - wie bereits bei älteren Versionen von Windows NT - nicht mehr möglich, in beliebige Verzeichnisse des Dateisystems zu schreiben. Dateien, auf die schreibend zugegriffen werden soll, müssen deswegen in einem der folgenden Verzeichnisse liegen:

Umgebungsvariable Beispielhafter Pfad Gilt für
%APPDATA% C:\Users\Henrik\AppData\Roaming den aktuellen Benutzer
%ProgramData% C:\ProgramData Alle Benutzer

Um Pfade zu erhalten, in denen man seine Dateien ablegen kann, reicht es also, die Umgebungsvariablen mit der Environ$()-Funktion abzufragen. Soll das Programm auch unter älteren Windows-Versionen wie etwa Windows XP funktionieren, bei denen die Umgebungsvariable %ProgramData% noch nicht existiert, muss auf die API-Funktion SHGetFolderPath() zurückgegriffen werden.
Als Hilfsmittel können die folgenden Funktionen verwendet werden:

' Auf die nötigen Einträge gekürzt :)
Private Enum CSIDL
   APPDATA = &H1A
   COMMON_APPDATA = &H23
End Enum

Private Declare Function SHGetFolderPathA Lib "Shell32" ( _
   ByVal hwndOwner As Long, _
   ByVal nFolder As Long, _
   ByVal hToken As Long, _
   ByVal dwFlags As Long, _
   ByVal pszPath As String) As Long

Private Const MAX_PATH As Long = 260&

Private Const SHGFP_TYPE_CURRENT As Long = 0&

' Um eine Datei zu erzeugen, auf die nur der aktuelle Benutzer zugreifen kann
Public Function FilePathCurrentUser(ByVal FileName As String) As String
   FilePathCurrentUser = MakePath(GetFolder(APPDATA), App.ProductName, FileName)
End Function

' Um eine Datei zu erzeugen, auf die alle Benutzer zugreifen können
Public Function FilePathAllUsers(ByVal FileName As String) As String
   FilePathAllUsers = MakePath(GetFolder(COMMON_APPDATA), App.ProductName, FileName)
End Function

' Hilfsfunktion für die Erstellung von Pfaden
Public Function MakePath(ParamArray Parts() As Variant) As String
   MakePath = Replace$(Join$(Parts, "\"), "\\", "\")
End Function

' Kapselung für SHGetFolderPath
Private Function GetFolder(ByVal CSIDL As CSIDL) As String
   Dim Path As String: Path = Space$(MAX_PATH)
   
   Call SHGetFolderPathA(0&, CSIDL, 0&, SHGFP_TYPE_CURRENT, Path)
   GetFolder = Left$(Path, InStr(1, Path, vbNullChar) - 1)
End Function

Listing 1: Pfade ermitteln

Zu beachten ist dabei, dass auch in Unterordner von %ProgramData% nicht beliebig geschrieben werden darf, weswegen das Installationsprogramm beim Erstellen des entsprechenden Unterordners für Ihre Anwendung diesen mit entsprechenden Zugriffsrechten ausstatten muss, die es jedem Benutzer erlauben, darin Dateien zu erstellen und zu bearbeiten.

Der Virtual Store  

Versucht ein Program, das nicht über die notwendigen (Administrator-)Rechte verfügt, in ein beliebiges Verzeichnis zu schreiben (etwa das eigene Programmverzeichnis), so leiten die aktuellen Windows-Versionen diesen Zugriff stillschweigend in ein Verzeichnis unter C:\Users\Username\AppData\Local\VirtualStore\Program Files um. Die dort liegenden Dateien haben bei lesendem Zugriff Priorität, werden aber von vielen Deinstallationsprogrammen nicht entfernt, weswegen es bei der Neuinstallation eines Programmes dazu kommen kann, dass die Dateien im Virtual Store anstatt derer im Programmverzeichnis genutzt werden.
Ein kleines Beispiel: Das Programm foo.exe verwendet eine Informationsdatei settings.ini, in der diverse Einstellungen gespeichert werden. Dabei werden etwa die Sektionen [General] und [Files] vorausgesetzt. Die Datei liegt standardmäßig im Programmverzeichnis.
Werden nun Einstellungen im Programm geändert, so speichert das Programm diese in der settings.ini, wobei Windows den Zugriff auf die settings.ini im Virtual Store umlenkt. Die Datei im Programmverzeichnis bleibt auf dem alten Stand.
Nun installiert der Benutzer eine neuere Version des Programms foo.exe, das in der settings.ini zusätzlich die Sektion [Connections] benötigt. Bei der Installation wird zudem die settings.ini im Programmverzeichnis aktualisiert, damit das Programm lauffähig bleibt. Das Setup-Programm kann problemlos auf das Programmverzeichnis zugreifen, da es grundsätzlich mit Administratorrechten ausgestattet ist.
Startet der Benutzer nun allerdings das Programm, so ergibt sich ein Problem: Da die settings.ini im Virtual Store nicht gelöscht oder aktualisiert worden ist, wird auf diese Version zugegriffen, in der die neue Sektion [Connections] fehlt - es kommt im schlimmsten Falle zum Absturz des Programms. Abhilfe schafft jetzt nur noch das manuelle Löschen der Datei im Virtual Store.
Um Szenarien wie solche zu vermeiden, sollten Programme ihre Dateien also grundsätzlich wie oben beschrieben ablegen und auf das Programmverzeichnis als Datenspeicher verzichten.

Dasselbe Problem ergibt sich übrigens, wenn ein Programm versucht, schreibend auf den Registry-Hauptschlüssel HKEY_LOCAL_MACHINE (HKLM) zuzugreifen. In diesem Falle wird der Zugriff auf HKEY_CURRENT_USER (HKCU), bzw. genau genommen auf HKCU\Software\Classes\VirtualStore\MACHINE\SOFTWARE umgeleitet.

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.