Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

Reg-Datei öffnen und importieren per Visual Basic...

Mic2004 / 9 Antworten / Baumansicht Nickles

Hallo Leute!

Ich versuche mir gerade ein kleines Tool zusammenzubauen, welches es u.A. dem Nutzer ermöglicht eine zu öffnende Reg-Datei in die Windows Registry zu importieren. Dazu habe ich folgenden Code im Internet gefunden:


Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long

Private Declare Function GetSaveFileName Lib "comdlg32.dll" Alias _
"GetSaveFileNameA" (pOpenfilename As OPENFILENAME) As Long

Private Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type

Private Const OFN_HIDEREADONLY = &H4
Private Const OFN_PATHMUSTEXIST = &H800
Private Const OFN_FILEMUSTEXIST = &H1000
Private Const OFN_OVERWRITEPROMPT = &H2

Function DialogOpenSave$(F As Form, ByVal ftitle$, _
fpfad$, ByVal ffile$, ByVal ffilter$, ByVal fext$, SaveFile%)

Dim O As OPENFILENAME
Dim wSize As Long
Dim Memhandle As Long

szFile$ = ffile$ + String$(128 - Len(ffile$), 0)
szFilter$ = ffilter$ + "||"
Do While InStr(szFilter$, "|")
szFilter$ = Left$(szFilter$, InStr(szFilter$, "|") - 1) + _
Chr$(0) + Mid$(szFilter$, InStr(szFilter$, "|") + 1)
Loop

O.lStructSize = Len(O)
O.hwndOwner = F.hWnd
O.nFilterIndex = 1
O.nMaxFile = Len(szFile$)

Select Case SaveFile%
Case 0:
O.flags = OFN_HIDEREADONLY Or OFN_PATHMUSTEXIST Or _
OFN_FILEMUSTEXIST
Case 1:
O.flags = OFN_HIDEREADONLY Or OFN_PATHMUSTEXIST Or _
OFN_OVERWRITEPROMPT
Case 2:
O.flags = OFN_HIDEREADONLY Or OFN_PATHMUSTEXIST
End Select

O.lpstrFile = szFile$
O.lpstrFilter = szFilter$
O.lpstrTitle = ftitle$
O.lpstrDefExt = fext$
O.lpstrInitialDir = fpfad$

If SaveFile% = 0 Then
result = GetOpenFileName(O)
Else
result = GetSaveFileName(O)
End If

file$ = Left$(O.lpstrFile, InStr(O.lpstrFile, Chr$(0)) - 1)

If result = 0 Then DialogOpenSave$ = "": Exit Function

fpfad$ = Left$(file$, O.nFileOffset)
DialogOpenSave$ = Right$(file$, Len(file$) - O.nFileOffset)
End Function

Function Dialog_Open$(F As Form, ByVal ftitle$, fpfad$, _
ByVal ffile$, ByVal ffilter$, ByVal fext$)
Dialog_Open$ = DialogOpenSave$(F, ftitle$, fpfad$, _
ffile$, ffilter$, fext$, 0)
End Function

Function Dialog_Save$(F As Form, ByVal ftitle$, fpfad$, _
ByVal ffile$, ByVal ffilter$, ByVal fext$)
Dialog_Save$ = DialogOpenSave$(F, ftitle$, fpfad$, _
ffile$, ffilter$, fext$, 1)
End Function

Private Sub Command1_Click()
p$ = CurDir$ 'Vorgabe-Pfad
F$ = "" 'Vorgabe-Datei
a$ = Dialog_Open$(Me, "Datei öffnen", p$, F$, _
"Text-Dateien|*.txt|Alle Dateien|*.*", "txt")
If Right$(p$, 1) "\" Then p$ = p$ + "\"
If Len(a$) Then MsgBox p$ + a$
End Sub

Private Sub Command2_Click()
p$ = CurDir$ 'Vorgabe-Pfad
F$ = "test.txt" 'Vorgabe-Datei
a$ = Dialog_Save$(Me, "Datei speichern", p$, F$, _
"Text-Dateien|*.txt|Alle Dateien|*.*", "txt")
If Right$(p$, 1) "\" Then p$ = p$ + "\"
If Len(a$) Then MsgBox p$ + a$
End Sub

Private Sub Form_Load()
Command1.Caption = "Öffnen..."
Command2.Caption = "Speichern..."
End Sub


Diesen Code habe ich ein wenig modifizert, weil ich ja nur Dateien öffnen will und nichts speichern und damit ich damit statt TXT-Dateien REG-Dateien öffnen kann. Das funktioniert soweit auch.

Will ich die geöffnete Reg-Datei aber dann mit dem Befehl TaskID = Shell("C:\WINDOWS\regedit.exe " + p$ + a$) in die Windows Registry schreiben lassen, kommt die Fehlermeldung vom Registrierungseditor, dass die Datei fehlerhaft ist. Das Problem liegt darin, dass der Pfad bei dem ersten Leerzeichen in einem Ordnernamen abgebrochen wird. (Beispiel: Aus C:\Eigene Dateien\Registry 001.reg wird dann C:\Eigene) Kann mir da jemand weiterhelfen.

Außerdem möchte ich anstelle des Pfads C:\Windows gern die von Windows dafür vorgegebene Umgebungsvvariable %windir% nutzen. Kann mir auch da jemand sagen, wie man das Visual Basic beibringt.

Als letztes möchte ich noch einen Button einfügen, mit dem man eine Reg-Datei, wie oben beschrieben, öffnen kann, um sie zu löschen. Hat da auch jemand eine Tipp für einen einfachen Quell-Code?

Vielen Dank schon einmal im Voraus.

Grüße,
Mic2004.

bei Antwort benachrichtigen
Borlander Mic2004 „Reg-Datei öffnen und importieren per Visual Basic...“
Optionen
Aus C:\Eigene Dateien\Registry 001.reg wird dann C:\Eigene
Dann mußt Du den Pfad in Anführungszeichen einfassen. Wenn ich mich recht an meine BASIC-Zeit (noch unter DOS) zurückerinnere, dann kannst Du mit "" ein " in Strings einfügen. Die Hilfe sollte aber ansonsten auch verraten wie es geht...

Mit der Umgebungsvariable würde ich einfach mal so ausprobieren ob die nicht geschluckt wird...

Gruß
Borlander
bei Antwort benachrichtigen
Mic2004 Borlander „ Dann mußt Du den Pfad in Anführungszeichen einfassen. Wenn ich mich recht an...“
Optionen

Hallo!

Da in Visual Basic Anführungszeichen für Texteingaben stehen, kann ich sie hier nicht verwenden. Es muss also einen anderen Weg geben. Vielleicht kann man ihn zwingen mit den kurzen Dateinamen C:\Eigene~1\Registry~1.reg zu arbeiten. Ich weiß nur nicht wie.

Gibt man die Umgebungsvariable %windir% einfach in den Pfad mit ein, kommt eine Fehlermeldung, dass dieser Pfad nicht existiert. Auch da muss der Weg also anders sein.

Grüße,
Mic2004.

bei Antwort benachrichtigen
Borlander Mic2004 „Hallo! Da in Visual Basic Anführungszeichen für Texteingaben stehen, kann ich...“
Optionen
Da in Visual Basic Anführungszeichen für Texteingaben stehen, kann ich sie hier nicht verwenden.
Du musst sie natürlich irgendwie Escapen. Ich hatte doch oben schon geschrieben, daß dies vermutlich mit "" möglich sein wird so ich mich richtig erinnere...

Was %windir% angeht: Gibt sicherlich eine Funktion um an das Windows-Verzeichnis heran zu kommen. Notfalls aus der Registry auslesen...

Gruß
Borlander
bei Antwort benachrichtigen
Mic2004 Borlander „ Du musst sie natürlich irgendwie Escapen. Ich hatte doch oben schon...“
Optionen

Hallo!

Dann gib mir doch bitte mal einen Beispielquellcode an, wie ich das deiner Meinung nach eingeben muss.

Welche Funktion könnte das in Bezug auf %windir% sein? Kannst du mir auch dafür einen Beispielquellcode sagen?

Danke!

Grüße,
Mic2004.

bei Antwort benachrichtigen
Borlander Mic2004 „Hallo! Dann gib mir doch bitte mal einen Beispielquellcode an, wie ich das...“
Optionen

Ist das so schwierig zu verstehen wie das mit dem Escapen von Anführungszeichen funktioniert? (Und das auch nur unter den Vorraussetzungen daß es bei VB genauso läuft wie unter DOS und ich nicht mit einer der diversen anderen verfügbaren Programmiersprachen durcheinander gekommen bin...)

"C:\WINDOWS\regedit.exe """ + p$ + a$ + """"

Welche Funktion könnte das in Bezug auf %windir% sein?
Mehr als auf die Hilfe verweisen kann ich auch nicht. Ich habe nie mit VB programmiert, wenn man mal von dem erzwungenen kurzen Rückgriff auf VBA absieht der nur zum zwecke der externen ansteuerung von Word/Excel per COM diente...

bei Antwort benachrichtigen
Mic2004 Borlander „Ist das so schwierig zu verstehen wie das mit dem Escapen von Anführungszeichen...“
Optionen

Ja das ist so schwierig zu verstehen, weil Visoal Basic mit so einer Schreibweise nichts anfangen kann!!! Anführungszeichen sind für Texteingaben reserviert!!!

Ich meine nicht das VB in Word bzw. Excel.

bei Antwort benachrichtigen
Borlander Mic2004 „Ja das ist so schwierig zu verstehen, weil Visoal Basic mit so einer...“
Optionen

Also laut http://vb-tec.de/strquote.htm (übrigens gleich unter den ersten 3 Ergebnissen bei Suche nach VB String) geht es aber so. Zwei aufeinanderfolgende Anführungszeichen sind trotz der Verwendung des Anführungszeichens als String-Begrenzer immer noch eine eindeutige Abbildungsmöglichkeit - in beide Richtungen...

bei Antwort benachrichtigen
Andreas42 Mic2004 „Ja das ist so schwierig zu verstehen, weil Visoal Basic mit so einer...“
Optionen

Hi!

Gibt es CHR() oder CHR$() noch? Also eine Funktion,die aus einem numerischen das ASCII- oder ANSI-Zeichen erzeugt?

Damit hab' ich immer meine Probleme in diese Richtung erschlagen. Ich hab' nur kein VB um nachsehen zu können,wie die Funktion nun genau heisst.

Das Anführungszeichen müsste den Wert 34 haben, also mit chr(34) erzeugt werden können.

Bis dann
Andreas

Hier steht was ueber mein altes Hard- und Softwaregedoens.
bei Antwort benachrichtigen
Mic2004 Andreas42 „Hi! Gibt es CHR oder CHR noch? Also eine Funktion,die aus einem numerischen das...“
Optionen

Okay, hat funktioniert! Vielen Dank an euch! Sollte ich noch andere Probleme habe, melde ich mich noch einmal.

bei Antwort benachrichtigen