Die Community zu .NET und Classic VB.
Menü

VB 5/6-Tipp 0543: Programm mit Dateiendung assoziieren II

 von 

Beschreibung 

Dies ist eine Erweiterung zu Tipp 1. Er erstellt einen Dateityp, verknüpft ihn mit einem Programm und weist ihm außerdem noch ein Icon zu.

Schwierigkeitsgrad:

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

RegCloseKey, RegCreateKeyExA (RegCreateKeyEx), RegDeleteKeyA (RegDeleteKey), RegDeleteValueA (RegDeleteValue), RegFlushKey, RegOpenKeyExA (RegOpenKeyEx), RegQueryValueExA (RegQueryValueEx), RegSetValueExA (RegSetValueEx), RegSetValueExA (RegSetValueEx_Str)

Download:

Download des Beispielprojektes [3,68 KB]

'Dieser Quellcode stammt von http://www.activevb.de
'und kann frei verwendet werden. Für eventuelle Schäden
'wird nicht gehaftet.

'Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
'Ansonsten viel Spaß und Erfolg mit diesem Source!

'------------- Anfang Projektdatei Projekt1.vbp -------------
' Die Komponente 'Microsoft Common Dialog Control 6.0 (SP3) (COMDLG32.OCX)' wird benötigt.

'--------- Anfang Formular "Form1" alias Form1.frm  ---------
' Steuerelement: Standarddialog-Steuerelement "CommonDialog1"
' Steuerelement: Schaltfläche "Command2"
' Steuerelement: Bildfeld-Steuerelement "Picture1"
' Steuerelement: Schaltfläche "Command1"
' Steuerelement: Textfeld "Text1"
' Steuerelement: Beschriftungsfeld "Label1"
Option Explicit



Private Declare Function RegOpenKeyEx Lib "advapi32.dll" _
        Alias "RegOpenKeyExA" ( _
        ByVal hKey As Long, _
        ByVal lpSubKey As String, _
        ByVal ulOptions As Long, _
        ByVal samDesired As Long, _
        phkResult As Long) As Long
        
Private Declare Function RegCloseKey Lib "advapi32.dll" _
        (ByVal hKey As Long) As Long
        
Private Declare Function RegQueryValueEx Lib "advapi32.dll" _
        Alias "RegQueryValueExA" ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String, _
        ByVal lpReserved As Long, _
        lpType As Long, _
        lpData As Any, _
        lpcbData As Any) As Long
        
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" _
        Alias "RegCreateKeyExA" ( _
        ByVal hKey As Long, _
        ByVal lpSubKey As String, _
        ByVal Reserved As Long, _
        ByVal lpClass As String, _
        ByVal dwOptions As Long, _
        ByVal samDesired As Long, _
        ByVal lpSecurityAttributes As Any, _
        phkResult As Long, _
        lpdwDisposition As Long) As Long
        
Private Declare Function RegFlushKey Lib "advapi32.dll" ( _
        ByVal hKey As Long) As Long
        
Private Declare Function RegSetValueEx Lib "advapi32.dll" _
        Alias "RegSetValueExA" ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String, _
        ByVal Reserved As Long, ByVal _
        dwType As Long, _
        lpData As Long, _
        ByVal cbData As Long) As Long
        
Private Declare Function RegSetValueEx_Str Lib "advapi32.dll" _
        Alias "RegSetValueExA" ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String, _
        ByVal Reserved As Long, _
        ByVal dwType As Long, _
        ByVal lpData As String, _
        ByVal cbData As Long) As Long

Private Declare Function RegDeleteKey Lib "advapi32.dll" Alias _
        "RegDeleteKeyA" ( _
        ByVal hKey As Long, _
        ByVal lpSubKey As String) As Long
        
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias _
        "RegDeleteValueA" ( _
        ByVal hKey As Long, _
        ByVal lpValueName As String) As Long


Const HKEY_CLASSES_ROOT = &H80000000
Const HKEY_CURRENT_USER = &H80000001
Const HKEY_LOCAL_MACHINE = &H80000002
Const HKEY_USERS = &H80000003
Const HKEY_PERFORMANCE_DATA = &H80000004
Const HKEY_CURRENT_CONFIG = &H80000005
Const HKEY_DYN_DATA = &H80000006

Const KEY_QUERY_VALUE = &H1
Const KEY_SET_VALUE = &H2
Const KEY_CREATE_SUB_KEY = &H4
Const KEY_ENUMERATE_SUB_KEYS = &H8
Const KEY_NOTIFY = &H10
Const KEY_CREATE_LINK = &H20
Const KEY_READ = KEY_QUERY_VALUE Or _
                 KEY_ENUMERATE_SUB_KEYS _
                 Or KEY_NOTIFY
                 
Const KEY_ALL_ACCESS = KEY_QUERY_VALUE Or _
                       KEY_SET_VALUE Or _
                       KEY_CREATE_SUB_KEY Or _
                       KEY_ENUMERATE_SUB_KEYS Or _
                       KEY_NOTIFY Or _
                       KEY_CREATE_LINK
                       
Const ERROR_SUCCESS = 0&

Const REG_NONE = 0
Const REG_SZ = 1
Const REG_EXPAND_SZ = 2
Const REG_BINARY = 3
Const REG_DWORD = 4
Const REG_DWORD_LITTLE_ENDIAN = 4
Const REG_DWORD_BIG_ENDIAN = 5
Const REG_LINK = 6
Const REG_MULTI_SZ = 7

Const REG_OPTION_NON_VOLATILE = &H0
Dim PicturePath As String
Private RegRoot&

Private Sub Command1_Click()
    Dim Result&
    Dim StrVar$
    Dim SecondKey As String
    Dim RegRoot2&
    Dim SystemVerzeichnis As String
    'Schlüssel erstellen

    RegRoot = HKEY_CLASSES_ROOT

    Result = RegKeyCreate(RegRoot, Text1.Text)
    
    SecondKey = Text1.Text
    SecondKey = Replace(SecondKey, ".", "*")
    Result = RegKeyCreate(RegRoot, SecondKey & "file")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\DefaultIcon")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\Quickview")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\Shell")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\Shell\open")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\Shell\print")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\Shell\open\Command")
    Result = RegKeyCreate(RegRoot, SecondKey & "file\Shell\print\Command")
    
    StrVar = SecondKey & "file"
    Result = RegValueSet(RegRoot, Text1.Text, "", StrVar)
    
    StrVar = SecondKey & "file"
    
    If PicturePath <> "" Then
        Result = RegValueSet(RegRoot, SecondKey & "file\" & _
            "DefaultIcon", "", PicturePath & ",0")
    End If
    
    SystemVerzeichnis = Left$(Environ$("comspec"), Len(Environ$("comspec")) - 7)
    Result = RegValueSet(RegRoot, SecondKey & "file\" & _
        "Shell\open\Command", "", SystemVerzeichnis & "NOTEPAD.EXE %1")
        
    Result = RegValueSet(RegRoot, SecondKey & "file\" & _
        "Shell\print\Command", "", SystemVerzeichnis & "NOTEPAD.EXE /p %1")
    
    Open "C:\Sample" & Text1.Text For Output As #1
    Close #1
    
    MsgBox "Dateityp wurde erfolgreich erstellt!" _
    & vbCrLf & "Beispiel-Datei unter C:\ mit dem Namen Sample" & Text1.Text
    
End Sub

Private Sub Command2_Click()
    On Error Goto CancelIsPressed
    
    CommonDialog1.CancelError = True
    CommonDialog1.Filter = "Icons (*.ico)|*.ico"
    CommonDialog1.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly
    CommonDialog1.ShowOpen
    
    If Right$(CommonDialog1.FileTitle, "3") <> "ico" Then
        MsgBox "Falscher Dateityp"
    End If
    
    Picture1.Picture = LoadPicture(CommonDialog1.FileName)
    Picture1.AutoSize = True
    PicturePath = CommonDialog1.FileName
    
CancelIsPressed:
End Sub

Function RegKeyCreate(Root&, Newkey$) As Long
    Dim Result&, hKey&, Back&
    'Neuen Schlüssel erstellen
    
    Result = RegCreateKeyEx(Root, Newkey, 0, vbNullString, _
                            REG_OPTION_NON_VOLATILE, _
                            KEY_ALL_ACCESS, 0&, hKey, Back)
                            
    If Result = ERROR_SUCCESS Then
        Result = RegFlushKey(hKey)
        If Result = ERROR_SUCCESS Then Call RegCloseKey(hKey)
        RegKeyCreate = Back
    End If
End Function


Function RegValueSet(Root&, Key$, Field$, Value As Variant) As Long
    Dim Result&, hKey&, s$, l&
    'Wert in ein Feld der Registry schreiben
    
    Result = RegOpenKeyEx(Root, Key, 0, KEY_ALL_ACCESS, hKey)
    If Result = ERROR_SUCCESS Then
        Select Case VarType(Value)
            Case vbInteger, vbLong
                l = CLng(Value)
                Result = RegSetValueEx(hKey, Field, 0, REG_DWORD, l, 4)
            Case vbString
                s = CStr(Value)
                Result = RegSetValueEx_Str(hKey, Field, 0, REG_SZ, _
                                        s, Len(s) + 1)
        End Select
        Result = RegCloseKey(hKey)
    End If
    
    RegValueSet = Result
End Function

Function RegValueGet(Root&, Key$, Field$, Value As Variant) As Long
    Dim Result&, hKey&, dwType&, Lng&, Buffer$, l&
    'Wert aus einem Feld der Registry auslesen
    
    Result = RegOpenKeyEx(Root, Key, 0, KEY_READ, hKey)
    If Result = ERROR_SUCCESS Then
        Result = RegQueryValueEx(hKey, Field, 0&, dwType, ByVal 0&, l)
        If Result = ERROR_SUCCESS Then
            Select Case dwType
                Case REG_SZ
                    Buffer = Space$(l + 1)
                    Result = RegQueryValueEx(hKey, Field, 0&, _
                                     dwType, ByVal Buffer, l)
                                     
                    If Result = ERROR_SUCCESS Then Value = Buffer
                Case REG_DWORD
                    Result = RegQueryValueEx(hKey, Field, 0&, _
                                      dwType, Lng, l)
                                      
                    If Result = ERROR_SUCCESS Then Value = Lng
            End Select
        End If
    End If
    
    If Result = ERROR_SUCCESS Then Result = RegCloseKey(hKey)
    RegValueGet = Result
End Function
'---------- Ende Formular "Form1" alias Form1.frm  ----------
'-------------- Ende Projektdatei Projekt1.vbp --------------

Tipp-Kompatibilität:

Windows/VB-VersionWin32sWin95Win98WinMEWinNT4Win2000WinXP
VB4
VB5
VB6

Hat dieser Tipp auf Ihrem Betriebsystem und mit Ihrer VB-Version funktioniert?

Ja, funktioniert!

Nein, funktioniert nicht bei mir!

VB-Version:

Windows-Version:

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen 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.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 1 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von Faraj, Raed am 23.02.2009 um 23:04

sehr geehrte Damen und Herren,

Ich arbeite mit Visual Basic 2008 unter Windows xp und habe der folgende Fehler bei diesem Code:

Der Fehler wird so gezeigt und Lautet:
Registry-Eintrag nicht gefunden!
HKLM\SOFTWARE\MIcrosoft\WIndows\CurrenVersion\ProgramFilesDir

Das Code:
Option Strict Off
Option Explicit On
Module modRegEdit

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA"(ByVal hKey As Integer, ByVal lpSubKey As String, ByVal ulOptions As Integer, ByVal samDesired As Integer, ByRef phkResult As Integer) As Integer

Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Integer) As Integer

'UPGRADE_ISSUE: Das Deklarieren eines Parameters als ''As Any'' wird nicht unterstützt. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="FAE78A8D-8978-4FD4-8208-5B7324A8F795"'
'UPGRADE_ISSUE: Das Deklarieren eines Parameters als ''As Any'' wird nicht unterstützt. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="FAE78A8D-8978-4FD4-8208-5B7324A8F795"'
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Integer, ByVal lpValueName As String, ByVal lpReserved As Integer, ByRef lpType As Integer, ByRef lpData As Integer, ByRef lpcbData As Integer) As Integer

Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA"(ByVal hKey As Integer, ByVal lpValueName As String, ByVal Reserved As Integer, ByVal dwType As Integer, ByRef lpData As Integer, ByVal cbData As Integer) As Integer

Private Declare Function RegFlushKey Lib "advapi32.dll" (ByVal hKey As Integer) As Integer

Private Declare Function RegSetValueEx_Str Lib "advapi32.dll" Alias "RegSetValueExA"(ByVal hKey As Integer, ByVal lpValueName As String, ByVal Reserved As Integer, ByVal dwType As Integer, ByVal lpData As String, ByVal cbData As Integer) As Integer

'UPGRADE_ISSUE: Das Deklarieren eines Parameters als ''As Any'' wird nicht unterstützt. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="FAE78A8D-8978-4FD4-8208-5B7324A8F795"'
Private Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey As Integer, ByVal lpSubKey As String, ByVal Reserved As Integer, ByVal lpClass As String, ByVal dwOptions As Integer, ByVal samDesired As Integer, ByVal lpSecurityAttributes As Integer, ByRef phkResult As Integer, ByRef lpdwDisposition As Integer) As Integer

Public Const HKEY_CURRENT_USER As Integer = &H80000001
Public Const HKEY_LOCAL_MACHINE As Integer = &H80000002

Const KEY_QUERY_VALUE As Integer = &H1
Const KEY_SET_VALUE As Integer = &H2
Const KEY_CREATE_SUB_KEY As Integer = &H4
Const KEY_ENUMERATE_SUB_KEYS As Integer = &H8
Const KEY_NOTIFY As Integer = &H10
Const KEY_CREATE_LINK As Integer = &H20
Const KEY_ALL_ACCESS As Boolean = KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK
Const KEY_READ As Boolean = KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY
Const ERROR_SUCCESS As Short = 0

Const REG_OPTION_NON_VOLATILE As Integer = &H0

Const REG_SZ As Short = 1
Const REG_DWORD As Short = 4

Public Function RegValueSet(ByRef Root As Integer, ByRef Key As String, ByRef Field As String, ByRef Value As Object) As Integer
Dim hKey, Result, l As Integer
Dim s As String
'Wert in ein Feld der Registry schreiben
Result = RegOpenKeyEx(Root, Key, 0, KEY_ALL_ACCESS, hKey)
If Result = ERROR_SUCCESS Then
'UPGRADE_WARNING: VarType hat ein neues Verhalten. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="9B7D5ADD-D8FE-4819-A36C-6DEDAF088CC7"'
Select Case VarType(Value)
Case VariantType.Short, VariantType.Integer
'UPGRADE_WARNING: Die Standardeigenschaft des Objekts Value konnte nicht aufgelöst werden. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
l = CInt(Value)
Result = RegSetValueEx(hKey, Field, 0, REG_DWORD, l, 4)
Case VariantType.String
'UPGRADE_WARNING: Die Standardeigenschaft des Objekts Value konnte nicht aufgelöst werden. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
s = CStr(Value)
Result = RegSetValueEx_Str(hKey, Field, 0, REG_SZ, s, Len(s) + 1)
End Select
Result = RegCloseKey(hKey)
End If

RegValueSet = Result
End Function

Public Function RegValueGet(ByRef Root As Integer, ByRef Key As String, ByRef Field As String, ByRef Value As Object) As Integer
Dim Lng, hKey, Result, dwType, l As Integer
Dim Buffer As String
'Wert aus einem Feld der Registry auslesen
Result = RegOpenKeyEx(Root, Key, 0, KEY_READ, hKey)
If Result = ERROR_SUCCESS Then
Result = RegQueryValueEx(hKey, Field, 0, dwType, 0, l)
If Result = ERROR_SUCCESS Then
Select Case dwType
Case REG_SZ
Buffer = Space(l + 1)
Result = RegQueryValueEx(hKey, Field, 0, dwType, Buffer, l)
If Result = ERROR_SUCCESS Then
'UPGRADE_WARNING: Die Standardeigenschaft des Objekts Value konnte nicht aufgelöst werden. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
Value = Left(Buffer, Len(Buffer) - 2)
End If
Case REG_DWORD
Result = RegQueryValueEx(hKey, Field, 0, dwType, Lng, l)
'UPGRADE_WARNING: Die Standardeigenschaft des Objekts Value konnte nicht aufgelöst werden. Klicken Sie hier für weitere Informationen: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="6A50421D-15FE-4896-8A1B-2EC21E9037B2"'
If Result = ERROR_SUCCESS Then Value = Lng
End Select
End If
End If

If Result = ERROR_SUCCESS Then Result = RegCloseKey(hKey)
RegValueGet = Result
End Function

Function RegKeyCreate(ByRef Root As Integer, ByRef Newkey As String) As Integer
Dim hKey, Result, Back As Integer
'Neuen Schlüssel erstellen
Result = RegCreateKeyEx(Root, Newkey, 0, vbNullString, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, 0, hKey, Back)
If Result = ERROR_SUCCESS Then
Result = RegFlushKey(hKey)
If Result = ERROR_SUCCESS Then Call RegCloseKey(hKey)
RegKeyCreate = Back
End If
End Function

Function RegKeyExist(ByRef Root As Integer, ByRef Key As String) As Integer
Dim Result, hKey As Integer
'Prüfen ob ein Schlüssel existiert
Result = RegOpenKeyEx(Root, Key, 0, KEY_READ, hKey)
If Result = ERROR_SUCCESS Then Call RegCloseKey(hKey)
RegKeyExist = Result
End Function
End Module


Ich werde mich sehr freuen, wenn Sie mir hier weiter helfen können.

Mit freundlichen Grüßen
FARAJ