Registry

Liebe www-ler
Die folgende Bitte habe ich schon einmal gestellt und damit eine ziemlich hitzige Diskussion ausgelöst, aber keine Antwort bekommen.

Nun habe ich weiter herumgestöbert und kann mich jetzt ziemlich präziser ausdrücken (finde ich zumindest :wink:

Ich bräuchte den Quellcode für ein Programm in C++, das die folgenden Registry-Eintragungen vornimmt. Hier der genaue Wortlaut der Tipps, welche ich erhalten habe:

Sie tragen für die Extension „XYZ“ in
HKey_Local_Machine\Software\Classes.xyz\
unter „default“ irgendeinen Namen ein, z.B. „xyz_auto_file“.
Unter diesem Namen tragen Sie jetzt in
HKey_Local_Machine\Software\Classes\xyz_auto_file\DefaultIcon\
unter „default“ den Progammpfad ein und unter HKey_Local_Machine\Software\Classes\xyz_auto_file\Shell\Open\Command
machen Sie den Eintrag
Progammpfad.exe „%1“

Die Extension XYZ würde ich dann später für meine Programme jeweils abändern können.

Ich hoffe, dass das Projekt jetzt machbar ist. Alle Versuche meinerseits scheiterten kläglich an meinen dürftigen Fachkenntnissen.

Ich zähle auf euch
Liebe Grüsse
Kalsan

Hallo

Du willst wahrscheinlich, das ein gewisser Dateityp mit automatisch mit deinem Programm geladen wird. Ich habe dasselbe mal in VB gefunden und es hat dort auch einwandfrei funktioniert. Du musst es dir halt selbst nach C++ portieren:

Option Explicit

' Benötigte API-Deklarationen
Private Declare Function CharLower Lib "user32" \_
 Alias "CharLowerA" ( \_
 ByVal lpsz As String) As String

Private Declare Function RegOpenKey Lib "advapi32.dll" \_
 Alias "RegOpenKeyA" ( \_
 ByVal hKey As Long, \_
 ByVal lpSubKey As String, \_
 phkResult 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 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 Any, \_
 ByVal cbData As Long) As Long

Private Declare Function RegCloseKey Lib "advapi32.dll" ( \_
 ByVal hKey As Long) As Long

Private Declare Function RegCreateKey Lib "advapi32.dll" \_
 Alias "RegCreateKeyA" ( \_
 ByVal hKey As Long, \_
 ByVal lpSubKey As String, \_
 phkResult As Long) As Long

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

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 RegEnumKey Lib "advapi32.dll" \_
 Alias "RegEnumKeyA" ( \_
 ByVal hKey As Long, \_
 ByVal dwIndex As Long, \_
 ByVal lpName As String, \_
 ByVal cbName As Long) As Long

Const KEY\_ENUMERATE\_SUB\_KEYS = &H8
Const ERROR\_SUCCESS = 0&
Const HKEY\_CLASSES\_ROOT = &H80000000
Const REG\_SZ = 1

Private Sub regSaveString(hKey As Long, sPath As String, sValue As String, \_
 iData As String)
 Dim vRet As Variant
 RegCreateKey hKey, sPath, vRet
 RegSetValueEx vRet, sValue, 0, REG\_SZ, ByVal iData, Len(iData)
 RegCloseKey vRet
End Sub

Public Sub RegisterFileType(ByVal FileType As String)
 Dim TypeName As String

 If FileType = "" Then
 MsgBox "Dateiendung benötigt.", vbCritical
 Exit Sub
 End If

 FileType = CharLower(FileType)
 If Left(FileType, 1) "." Then
 TypeName = FileType
 FileType = "." & FileType
 Else
 TypeName = Right(FileType, Len(FileType) - 1)
 End If

 TypeName = TypeName & "file"

 regSaveString HKEY\_CLASSES\_ROOT, FileType, "", TypeName
 regSaveString HKEY\_CLASSES\_ROOT, TypeName & "\shell\open\command", \_
 "", App.Path & "\" & App.Title & ".exe %1"
 regSaveString HKEY\_CLASSES\_ROOT, TypeName & "\DefaultIcon", \_
 "", App.Path & "\" & App.Title & ".exe,0"
End Sub

Hallo Dixxi

Herzlichen Dank für deine Antwort.
Ich kenne Visual Basic leider nicht. Die einzigen Programmiersprachen, mit denen ich bekannt bin, sind TopPascal und C(++)

Hat jemand eine Ahnung, wie das in C++ aussieht?

Liebe Grüsse
Kalsan

Hallo Dixxi

Herzlichen Dank für deine Antwort.
Ich kenne Visual Basic leider nicht. Die einzigen
Programmiersprachen, mit denen ich bekannt bin, sind TopPascal
und C(++)

Hat jemand eine Ahnung, wie das in C++ aussieht?

Gibt es einen guten Grund dafür, dass es C++ sein muss? Etwa, dass irgendwelche Daten dabei dynamisch sind? Ansonsten ist eine .reg-Datei bzw. die Vornahme der Einstellungen im Installer vielleicht schlauer.

Grüße,
Sebastian

Hallo Sebastian

eine Reg-Datei würde auch gehen, vorausgesetzt, diese kann ohne grossen Aufwand für den Benutzer installiert werden.
Diese Datei könnte ich dann von meinem Programm bei der Erstausführung automatisch öffnen (Wird sie dabei automatisch installiert?).

Liebe Grüsse
Kalsan