Portable VB-Programme: Nutzung von ActiveX Komponenten ohne Registrierung und ohne Adminrechte

    • VB6

    Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Hallo!

      Es ist ein häufig vorkommendes Problem, dass man mit VB geschriebene Software auf Rechnern laufen lassen muss, auf denen man keine Adminrechte besitzt. Hierzu benötigt man also "portable" Versionen der eigenen Software, da eine Installation und Registrierung von Komponenten (vorwiegend ActiveX) nicht möglich ist. VB stellt im Projekt-Unterverzeichnis ..\Paket\Support zwar sämtliche nötigen Komponenten für das Projekt zur Verfügung, aber ein einfaches Kopieren dieser Komponenten auf einen USB-Stick oder eine CD reicht meist nicht aus, um eine portable Version zu erzeugen, wenn Komponenten enthalten sind, die eine Registrierung erfordern (z.B. ActiveX-Komponenten - *.OCX). Startet man solch ein Programm, erhält man die Fehlermeldung "Die Komponente 'XYZ' oder eine ihrer Abhängigkeiten ist nicht richtig registriert: Eine Datei fehlt oder ist ungültig." XYZ ist dann der Name der nicht registrierten ActiveX-Komponente. Ohne Administratorrechte ist eine Registrierung (z.B. mit regsvr32) leider nicht möglich, da die Komponenten im Registry-Zweig HKEY_CLASSES_ROOT registriert werden müssen, auf den eingeschränkte Benutzer keinen Schreibzugriff besitzen (auf diese Weise erfährt man aber immerhin, welche Komponenten überhaupt registriert werden müssen).

      Das Problem kann dadurch umgangen werden, dass man die Registrierungs-Informationen nicht in HKEY_CLASSES_ROOT schreibt, sondern in den Registry-Zweig des lokalen Users, auf den er vollen Zugriff besitzt, nämlich HKEY_CURRENT_USER\Software\Classes. Damit die Informationen vom Programm dann auch dort ausgelesen werden und nicht aus dem Standard-Pfad unter HKEY_CLASSES_ROOT, muss dieser Standard-Pfad auf den benutzereigenen Pfad HKEY_CURRENT_USER\Software\Classes quasi "umgebogen" werden. Ein solcher Verweis kann mit der API-Funktion RegOverridePredefKey erstellt werden, die ab Windows 2000 verfügbar ist. Für das laufende Programm ist der Pfad zu den OCX-Registrierungen dann nicht mehr unter HKEY_CLASSES_ROOT zu finden, sondern unter HKEY_CURRENT_USER.

      Zuerst einmal benötigt man also ein eigenständiges VB-Programm (Project1.vbp), das die Registrierung im Pfad des angemeldeten Users vornimmt. Es ersetzt praktisch "regsvr32" und wird zusammen mit den zu registrierenden DLLs und der eigentlichen VB-Software (aus dem Projekt-Unterverzeichnis ..\Paket\Support) z.B. auf einen USB-Stick kopiert. Dieses Programm muss nur einmal aufgerufen werden und nimmt die lokale Registrierung der nötigen Komponenten vor. Danach kann das eigentliche Programm immer wieder direkt gestartet werden.

      Das Programm zur lokalen Registrierung der ActiveX-Komponenten (Aufruf ohne Admin-Rechte)

      Visual Basic-Quellcode

      1. 'Autor: Volker Ulle
      2. 'E-Mail: vulle@web.de
      3. '------------- Anfang Projektdatei Project1.vbp -------------
      4. 'Project1 ist ein eigenständiges Programm und dient nur vorab
      5. 'zur lokalen Registrierung der Komponenten.
      6. '--------- Anfang Formular "Form1" alias Form1.frm ---------
      7. 'Diese Form wird nicht angezeigt, sondern dient lediglicht
      8. 'zur Registrierung von Libraries (ActiveX (OCX), DLL etc.)
      9. 'im Zweig HKEY_CURRENT_USER der Registry, auf die auch
      10. 'eingeschränkte Benutzer Schreibrechte besitzen.
      11. 'In diesem Beispiel werden COMCTL32.OCX und MSCOMM32.OCX
      12. 'registriert.
      13. Private Sub Form_Load()
      14. Dim sRet As String
      15. If Register_DLL("COMCTL32.OCX") = 0 Then
      16. sRet = sRet + vbCrLf + "COMCTL32.OCX"
      17. End If
      18. If Register_DLL("MSCOMM32.OCX") = 0 Then
      19. sRet = sRet + vbCrLf + "MSCOMM32.OCX"
      20. End If
      21. If sRet <> "" Then
      22. MsgBox "Folgende DLLs wurden erfolgreich im lokalen Benutzerkonto registriert: " + vbCrLf + sRet
      23. End If
      24. End
      25. End Sub
      26. '---------- Ende Formular "Form1" alias Form1.frm ----------
      27. '--------- Anfang Modul "Module1" alias Module1.bas ---------
      28. 'Registrierung einer (ActiveX-)Komponente
      29. Option Explicit
      30. Private Const ERROR_SUCCESS As Long = 0
      31. Private Const HKEY_CLASSES_ROOT As Long = &H80000000
      32. Private Const HKEY_CURRENT_USER As Long = &H80000001
      33. 'Registry-Keys
      34. Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
      35. ByVal hKey As Long, _
      36. ByVal lpSubKey As String, _
      37. phkResult As Long) As Long
      38. Private Declare Function RegOverridePredefKey Lib "advapi32" ( _
      39. ByVal hKey As Long, _
      40. ByVal hNewHKey As Long) As Long
      41. Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
      42. ByVal hKey As Long) As Long
      43. 'DLL-Registrierung
      44. Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" ( _
      45. ByVal lpLibFileName As String) As Long
      46. Private Declare Function FreeLibrary Lib "kernel32.dll" ( _
      47. ByVal hLibModule As Long) As Long
      48. Private Declare Function GetProcAddress Lib "kernel32.dll" ( _
      49. ByVal hModule As Long, _
      50. ByVal lpProcName As String) As Long
      51. Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
      52. ByVal lpPrevWndFunc As Long, _
      53. ByVal hwnd As Long, _
      54. ByVal msg As Long, _
      55. ByVal wParam As Long, _
      56. ByVal lParam As Long) As Long
      57. Public Function Register_DLL(DLLName As String) As Integer
      58. Dim lRet As Long
      59. Dim hKey As Long
      60. Dim hModule As Long
      61. Dim pAdr As Long
      62. Dim S As String
      63. Register_DLL = 0
      64. S = App.Path
      65. If Right(S, 1) <> "\" Then S = S & "\"
      66. S = S & DLLName
      67. 'Override HKEY_CLASSES_ROOT:
      68. If RegOpenKey(HKEY_CURRENT_USER, "Software\\Classes", hKey) = ERROR_SUCCESS Then
      69. lRet = RegOverridePredefKey(HKEY_CLASSES_ROOT, hKey)
      70. RegCloseKey hKey
      71. If lRet = ERROR_SUCCESS Then
      72. 'Call the normal registration entry:
      73. hModule = LoadLibrary(S)
      74. If hModule Then
      75. pAdr = GetProcAddress(hModule, "DllRegisterServer")
      76. If pAdr Then
      77. CallWindowProc pAdr, 0, 0, 0, ByVal 0
      78. Else
      79. Register_DLL = 4
      80. End If
      81. Else
      82. MsgBox "DLL-Error " + CStr(Err.LastDllError) + " beim Registrieren von " + DLLName
      83. Register_DLL = 1
      84. End If
      85. FreeLibrary hModule
      86. Else
      87. Register_DLL = 2
      88. End If
      89. Else
      90. Register_DLL = 3
      91. End If
      92. End Function
      93. '--------- Ende Modul "Module1" alias Module1.bas ---------
      94. '-------------- Ende Projektdatei Project1.vbp --------------


      In der eigentlichen VB-Software (Project2.vbp), die die zuvor registrierten Komponenten benutzt, muss der Registry-Pfad natürlich ebenfalls auf HKEY_CURRENT_USER "umgebogen" werden. Und zwar BEVOR die entsprechende Komponente angesprochen wird. Also am besten im Load-Ereignis der Haupt-Form. Der "umgebogene" Key hat nur innerhalb des Programms Gültigkeit. Außerhalb wird weiterhin der originale Key verwendet. Wenn das Programm beendet wird, sollte (am besten im Unload-Ereignis) dennoch die Funktion RestoreOverrideKey() aufgerufen werden. Denn innerhalb der VB-Entwicklungsumgebung wird der "umgebogene" Key beim Beenden des Programms nicht automatisch zurückgesetzt, was dazu führen würde, dass die Entwicklungsumgebung auf falsche Keys zugreift und es u.U. zu Fehlermeldungen kommt.

      Das eigentliche Benutzerprogramm, das Komponenten benutzt, die registriert werden müssen

      Visual Basic-Quellcode

      1. '------------- Anfang Projektdatei Project2.vbp -------------
      2. '--------- Anfang Formular "Form1" alias Form1.frm ---------
      3. Private Sub Form_Load()
      4. If OverrideKey Then
      5. MsgBox "Key override failed!"
      6. End
      7. End If
      8. End Sub
      9. Private Sub Form_Unload(Cancel As Integer)
      10. RestoreOverrideKey
      11. End Sub
      12. '--------- Ende Formular "Form1" alias Form1.frm ---------
      13. '--------- Anfang Modul "Module1" alias Module1.bas ---------
      14. Option Explicit
      15. Private Const ERROR_SUCCESS As Long = 0
      16. Private Const HKEY_CLASSES_ROOT As Long = &H80000000
      17. Private Const HKEY_CURRENT_USER As Long = &H80000001
      18. 'Registry-Keys
      19. Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
      20. ByVal hKey As Long, _
      21. ByVal lpSubKey As String, _
      22. phkResult As Long) As Long
      23. Private Declare Function RegOverridePredefKey Lib "advapi32" ( _
      24. ByVal hKey As Long, _
      25. ByVal hNewHKey As Long) As Long
      26. Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
      27. ByVal hKey As Long) As Long
      28. Public Function OverrideKey() As Integer
      29. Dim lRet As Long
      30. Dim hKey As Long
      31. OverrideKey = 1
      32. 'Override HKEY_CLASSES_ROOT:
      33. If RegOpenKey(HKEY_CURRENT_USER, "Software\\Classes", hKey) = ERROR_SUCCESS Then
      34. lRet = RegOverridePredefKey(HKEY_CLASSES_ROOT, hKey)
      35. RegCloseKey hKey
      36. If lRet = ERROR_SUCCESS Then
      37. OverrideKey = 0
      38. End If
      39. End If
      40. End Function
      41. Public Function RestoreOverrideKey() As Integer
      42. Dim lRet As Long
      43. RestoreOverrideKey = 1
      44. 'Restore Override of HKEY_CLASSES_ROOT:
      45. lRet = RegOverridePredefKey(HKEY_CLASSES_ROOT, 0&)
      46. If lRet = ERROR_SUCCESS Then
      47. RestoreOverrideKey = 0
      48. End If
      49. End Function
      50. '--------- Ende Modul "Module1" alias Module1.bas ---------
      51. '-------------- Ende Projektdatei Project2.vbp --------------


      Werden nun die Programmdateien zusammen mit den benötigten ActiveX-Komponenten und dem Registrierungs-Programm in ein Verzeichnis auf CD oder USB-Stick kopiert, kann man jedes VB-Programm auch ohne Registrierung und ohne Admin-Rechte starten. Erfolgreich getestet mit Windows XP und Windows 7.

      Gruß, Volker

      Edit by hal2000:
      - Code-Tags in VB-Tags geändert

      Edit by volkeru:
      - Deklaration der unbenutzten Variablen "TempPath" entfernt
      - Funktion RestoreOverrideKey eingeführt
      Edit by LaMa5:
      - die Farbe ROT ist ausschließlich für moderative Zwecke vorbehalten (Boardregeln §4.3c)
      --> Farbgebung angepasst

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „LaMa5“ ()

      Erweiterung des Codes

      Nach einigen Anfragen habe ich den oben vorgestellten Code etwas erweitert:
      • Der Code funktioniert erst ab Windows 2000 (und aufwärts). Daher wurde eine Versionsabfrage und ein entsprechender Hinweis bei ungeeigneten Windows-Versionen eingebaut.
      • Die unter HKEY_CURRENT_USER\Software\Classes\CLSID erzeugten Keys können nun auch "unregistriert" werden. In diesem Fall werden sie wieder aus der Registry des angemeldeten Benutzers entfernt. Dazu wird das Programm mit dem Parameter /u aufgerufen (Start -> Ausführen). Dazu wurde die Funktion "Register_DLL" um einen zusätzlichen, optionalen Parameter "Unregister" erweitert.
      • Der bei der Registrierung des Moduls "umgebogene" Registry-Key wird nach der Registrierung wieder auf den originalen Registrierungspfad zurückgesetzt.
      Das Programm zur lokalen Registrierung der ActiveX-Komponenten (Aufruf ohne Admin-Rechte)

      Visual Basic-Quellcode

      1. 'Autor: Volker Ulle
      2. 'E-Mail: vulle@web.de
      3. '------------- Anfang Projektdatei Project1.vbp -------------
      4. 'Project1 ist ein eigenständiges Programm und dient nur vorab
      5. 'zur lokalen Registrierung der Komponenten.
      6. '--------- Anfang Formular "Form1" alias Form1.frm ---------
      7. 'Diese Form wird nicht angezeigt, sondern dient lediglich
      8. 'zur Registrierung von Libraries (ActiveX (OCX), DLL etc.)
      9. 'im Zweig HKEY_CURRENT_USER der Registry, auf die auch
      10. 'eingeschränkte Benutzer Schreibrechte besitzen.
      11. 'In diesem Beispiel werden COMCTL32.OCX und MSCOMM32.OCX
      12. 'registriert.
      13. Private Sub Form_Load()
      14. Dim sRet As String
      15. Dim UnregParam As Boolean
      16. Dim WindowsVersion As String
      17. Dim Platform As Integer
      18. Dim Major As Integer
      19. Dim Minor As Integer
      20. WindowsVersion = GetWindowsVersion(Platform, Major, Minor)
      21. If Not MinWin2000() Then
      22. MsgBox "Diese Funktion ist erst ab Windows 2000 verfügbar!", vbExclamation
      23. Unload Me
      24. End
      25. End If
      26. If LCase(Command) = "/u" Then
      27. UnregParam = True
      28. Else
      29. UnregParam = False
      30. End If
      31. If Register_DLL("MSCOMCTL.OCX", UnregParam) = 0 Then
      32. sRet = sRet + vbCrLf + "MSCOMCTL.OCX"
      33. End If
      34. If Register_DLL("MSCOMM32.OCX", UnregParam) = 0 Then
      35. sRet = sRet + vbCrLf + "MSCOMM32.OCX"
      36. End If
      37. If Register_DLL("RICHTX32.OCX", UnregParam) = 0 Then
      38. sRet = sRet + vbCrLf + "RICHTX32.OCX"
      39. End If
      40. If sRet <> "" Then
      41. If UnregParam Then
      42. MsgBox "Sie nutzen " + WindowsVersion + " (" + CStr(Platform) + "." + CStr(Major) + "." + CStr(Minor) + ")" + vbCrLf + _
      43. "Folgende DLLs wurden erfolgreich im lokalen Benutzerkonto unregistriert: " + vbCrLf + sRet, vbInformation
      44. Else
      45. MsgBox "Sie nutzen " + WindowsVersion + " (" + CStr(Platform) + "." + CStr(Major) + "." + CStr(Minor) + ")" + vbCrLf + _
      46. "Folgende DLLs wurden erfolgreich im lokalen Benutzerkonto registriert: " + vbCrLf + sRet, vbInformation
      47. End If
      48. Else
      49. MsgBox "Sie nutzen " + WindowsVersion + " (" + CStr(Platform) + "." + CStr(Major) + "." + CStr(Minor) + ")" + vbCrLf + _
      50. "Es konnte keine DLL erfolgreich im lokalen Benutzerkonto un/registriert werden!", vbExclamation
      51. End If
      52. Unload Me
      53. End
      54. End Sub
      55. '---------- Ende Formular "Form1" alias Form1.frm ----------
      56. '--------- Anfang Modul "Module1" alias Module1.bas ---------
      57. Option Explicit
      58. Private Const ERROR_SUCCESS As Long = 0
      59. Private Const HKEY_CLASSES_ROOT As Long = &H80000000
      60. Private Const HKEY_CURRENT_USER As Long = &H80000001
      61. 'Datei-Existenz
      62. Private Declare Function GetFileAttributes Lib "kernel32.dll" Alias "GetFileAttributesA" ( _
      63. ByVal lpFileName As String) As Long
      64. 'Registry-Keys
      65. Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" ( _
      66. ByVal hKey As Long, _
      67. ByVal lpSubKey As String, _
      68. phkResult As Long) As Long
      69. Private Declare Function RegOverridePredefKey Lib "advapi32" ( _
      70. ByVal hKey As Long, _
      71. ByVal hNewHKey As Long) As Long
      72. Private Declare Function RegCloseKey Lib "advapi32.dll" ( _
      73. ByVal hKey As Long) As Long
      74. 'DLL-Registrierung
      75. Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" ( _
      76. ByVal lpLibFileName As String) As Long
      77. Private Declare Function FreeLibrary Lib "kernel32.dll" ( _
      78. ByVal hLibModule As Long) As Long
      79. Private Declare Function GetProcAddress Lib "kernel32.dll" ( _
      80. ByVal hModule As Long, _
      81. ByVal lpProcName As String) As Long
      82. Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
      83. ByVal lpPrevWndFunc As Long, _
      84. ByVal hwnd As Long, _
      85. ByVal msg As Long, _
      86. ByVal wParam As Long, _
      87. ByVal lParam As Long) As Long
      88. Private Function DoesFileExist(Path) As Boolean
      89. DoesFileExist = ((GetFileAttributes(Path)) <> -1)
      90. End Function
      91. Public Function Register_DLL(DLLName As String, Optional Unregister As Boolean = False) As Integer
      92. Dim lRet As Long
      93. Dim hKey As Long
      94. Dim hModule As Long
      95. Dim pAdr As Long
      96. Dim S As String
      97. Register_DLL = 0
      98. S = App.Path
      99. If Right(S, 1) <> "\" Then S = S & "\"
      100. S = S & DLLName
      101. If Not DoesFileExist(S) Then
      102. MsgBox "Datei " + S + " nicht vorhanden!", vbExclamation
      103. Register_DLL = 5
      104. Exit Function
      105. End If
      106. 'Override HKEY_CLASSES_ROOT:
      107. If RegOpenKey(HKEY_CURRENT_USER, "Software\\Classes", hKey) = ERROR_SUCCESS Then
      108. lRet = RegOverridePredefKey(HKEY_CLASSES_ROOT, hKey)
      109. RegCloseKey hKey
      110. If lRet = ERROR_SUCCESS Then
      111. 'Call the normal registration entry:
      112. hModule = LoadLibrary(S)
      113. If hModule Then
      114. If Unregister Then
      115. pAdr = GetProcAddress(hModule, "DllUnregisterServer")
      116. Else
      117. pAdr = GetProcAddress(hModule, "DllRegisterServer")
      118. End If
      119. If pAdr Then
      120. 'Modul unter dem Schlüssel HKEY_CURRENT_USER\Software\Classes\CLSID registrieren bzw. unregistrieren
      121. CallWindowProc pAdr, 0, 0, 0, ByVal 0
      122. Else
      123. Register_DLL = 4
      124. End If
      125. Else
      126. MsgBox "DLL-Error " + CStr(Err.LastDllError) + " beim Registrieren von " + DLLName
      127. Register_DLL = 1
      128. End If
      129. FreeLibrary hModule
      130. 'Restore Override of HKEY_CLASSES_ROOT:
      131. lRet = RegOverridePredefKey(HKEY_CLASSES_ROOT, 0&)
      132. If lRet <> ERROR_SUCCESS Then
      133. Register_DLL = 6
      134. End If
      135. Else
      136. Register_DLL = 2
      137. End If
      138. Else
      139. Register_DLL = 3
      140. End If
      141. End Function
      142. '--------- Ende Modul "Module1" alias Module1.bas ---------
      143. '--------- Anfang Modul "GetWinVers" alias GetWinVers.bas ---------
      144. ' Werte für dwPlatformId von OSVERSIONINFO
      145. Private Const VER_PLATFORM_WIN32s As Long = 0&
      146. Private Const VER_PLATFORM_WIN32_WINDOWS As Long = 1&
      147. Private Const VER_PLATFORM_WIN32_NT As Long = 2&
      148. Private Type OSVERSIONINFO
      149. dwOSVersionInfoSize As Long ' Größe der Struktur
      150. dwMajorVersion As Long ' Major-Versionsnummer
      151. dwMinorVersion As Long ' Minor-Versionsnummer
      152. dwBuildNumber As Long ' Build-Versionsnummer
      153. dwPlatformId As Long ' Plattform-Kennzeichner
      154. szCSDVersion As String * 128 ' Service Pack (Klartext)
      155. End Type
      156. ' Abrufen der Windows-Versionsinformationen:
      157. Private Declare Function GetVersionEx _
      158. Lib "kernel32" Alias "GetVersionExA" ( _
      159. ByRef VersionInformation As OSVERSIONINFO _
      160. ) As Long
      161. Public Function MinWin2000() As Boolean
      162. Dim OSVI As OSVERSIONINFO
      163. Dim lSuccess As Long
      164. MinWin2000 = False
      165. ' Größe der OSVERSIONINFO-Struktur angeben
      166. OSVI.dwOSVersionInfoSize = Len(OSVI)
      167. ' Abruf der Windows-Versionsinformationen
      168. lSuccess = GetVersionEx(OSVI)
      169. If lSuccess = 0 Then
      170. Exit Function
      171. End If
      172. If OSVI.dwPlatformId > 1 And OSVI.dwMajorVersion > 4 Then
      173. MinWin2000 = True
      174. End If
      175. End Function
      176. Public Function GetWindowsVersion(Platform As Integer, Major As Integer, Minor As Integer) As String
      177. Dim OSVI As OSVERSIONINFO
      178. Dim lSuccess As Long
      179. ' Größe der OSVERSIONINFO-Struktur angeben
      180. OSVI.dwOSVersionInfoSize = Len(OSVI)
      181. ' Abruf der Windows-Versionsinformationen
      182. lSuccess = GetVersionEx(OSVI)
      183. ' Erfolgreiche Abarbeitung überprüfen
      184. If lSuccess = 0 Then
      185. Exit Function
      186. End If
      187. ' Auswertung der Versionsnummern:
      188. Select Case OSVI.dwPlatformId ' Plattform-Kennzeichner
      189. Case VER_PLATFORM_WIN32s ' Win32s-Erweiterung
      190. GetWindowsVersion = "Win32s für Windows 3.x"
      191. Case VER_PLATFORM_WIN32_WINDOWS ' Windows 9x/Me
      192. Select Case OSVI.dwMinorVersion
      193. Case 0
      194. GetWindowsVersion = "Windows 95"
      195. Case 10
      196. GetWindowsVersion = "Windows 98"
      197. Case 90
      198. GetWindowsVersion = "Windows Me"
      199. End Select
      200. Case VER_PLATFORM_WIN32_NT ' Windows NT/2000/XP
      201. Select Case OSVI.dwMajorVersion
      202. Case 3
      203. GetWindowsVersion = "Windows NT 3." & CStr(OSVI.dwMinorVersion)
      204. Case 4
      205. GetWindowsVersion = "Windows NT 4.0"
      206. Case 5
      207. Select Case OSVI.dwMinorVersion
      208. Case 0
      209. GetWindowsVersion = "Windows 2000"
      210. Case 1
      211. GetWindowsVersion = "Windows XP"
      212. Case 2
      213. GetWindowsVersion = "Windows XP / Server 2003"
      214. End Select
      215. Case 6
      216. Select Case OSVI.dwMinorVersion
      217. Case 0
      218. GetWindowsVersion = "Windows Vista / Server 2008"
      219. Case 1
      220. GetWindowsVersion = "Windows 7"
      221. Case Else ' zukünftige Versionen von Windows 7
      222. GetWindowsVersion = "Windows 7 / Folgeversion"
      223. End Select
      224. Case Else ' zukünftige Versionen von Windows 7
      225. GetWindowsVersion = "Windows 7 / Folgeversion"
      226. End Select
      227. End Select
      228. Platform = OSVI.dwPlatformId
      229. Major = OSVI.dwMajorVersion
      230. Minor = OSVI.dwMinorVersion
      231. End Function
      232. '--------- Ende Modul "GetWinVers" alias GetWinVers.bas ---------
      233. '-------------- Ende Projektdatei Project1.vbp --------------

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „volkeru“ ()

      volkeru schrieb:

      Dieses Programm muss nur einmal aufgerufen werden und nimmt die lokale Registrierung der nötigen Komponenten vor. Danach kann das eigentliche Programm immer wieder direkt gestartet werden.
      Ich denke mal, dies ist nur dann richtig, solange sich kein anderer User unter seinem Account einloggt, denn der Part HKEY_CURRENT_USER wird jedes Mal vom System, so erforderlich, aus dem Bereich HKEY_USERS nach HKEY_CURRENT_USER kopiert.
      Dahingehend ist es sicherer, den Registrierungspart jedes mal mit aufzurufen, zumal dies keine Performance kostet.
      Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
      Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
      Ein guter .NET-Snippetkonverter (der ist verfügbar).
      Programmierfragen über PN / Konversation werden ignoriert!