2016-06-02 14 views
-1

Ich versuche, eine INI-Datei zu lesen und dann die Werte in die Registrierung zu speichern, damit eine Setup-Anwendung funktioniert.INI in Visual Basic lesen vb.NET

Die INI-Datei sieht wie folgt aus

[Setup Components] 

Sybase Adaptive Server Anywhere Client=Yes 

Borland Database Engine=Yes 

BDERoot=c:\Program Files\Borland\BDE 

Program Shortcuts=Yes 

ODBC Data Service Name=Yes 

Local Client = Yes 

Sybase Admin = Yes 

Sybase Directory= C:\Program Files\SQL Anywhere 16 

DBRoot=c:\Database 

Word Link=Yes 

Installation Root Folder=c:\program 

FireDAC=DB=asa16;eng=ENGINE;dbn=DBNAME;links=TCPIP{Host=127.0.0.1;Port=2638} 

[Program Shortcuts] 

Desktop=Yes 
Start Menu=Yes 

Program Title=PROGRAM 

EXE Pathname=c:\program.exe 

Parameters=DBNAME 

Starting Directory=c:\ 

Icon=icon.ICO 


[ODBC Data Service Name] 

Data Service Name=DBNAME 

Database File Name=c:\database\database.db 

Database Name=DBNAME 

Server Name=ENGINE 

Comm Links=TCPIP{} 

PrefetchBuffer=6000 

PrefetchRows=50 

CommBufferSize=1460 

Compress=no 


[Service] 

Service Name=SQLANYs_DBNAME 
Display Name=SQL Anywhere - DBNAME 
Service Group=SQLANYServer 
Params=-n DBNAME -x TCPIP{} "C:\database\database.db" -n DBNAME 

Also alles was ich brauche diese Elemente in die Registry einfach abgeladen werden.

Ich benutze Visual Studio 2015, ich habe versucht, Ludvik Jerabek INI-Leser (http://www.codeproject.com/Articles/21896/INI-Reader-Writer-Class-for-C-VB-NET-and-VBScript10) zu verwenden, aber hatte kein Glück, dass das funktioniert!

Der Code i für die oben verwendet haben war die folgende:

Dim ini = New IniFile() 
ini.Load("setup.ini") 
Dim readValue = ini.Sections("Service").Keys("Service Name") 
MessageBox.Show(readValue.ToString) 

Wenn dieser Code ausgeführt wird ich die folgende Fehlermeldung anzeigt:. „Konvertierung von String‚Service Integer ‚‘ eingeben‘ist nicht gültig - auch diese Methode bedeutet, jeden Schlüssel in der INI-Datei zu benennen, die ganz bestimmte Aufgabe wäre

ich ging dann ein anderes Verfahren, nachdem ich einige Hilfe Fragen hier gelesen und ich verwendet, um die folgenden:

Private Declare Auto Function GetPrivateProfileString Lib "kernel32" (ByVal lpAppName As String, 
    ByVal lpKeyName As String, 
    ByVal lpDefault As String, 
    ByVal lpReturnedString As StringBuilder, 
    ByVal nSize As Integer, 
    ByVal lpFileName As String) As Integer 


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim sb As StringBuilder 
    sb = New StringBuilder(500) 
    Dim readVal = GetPrivateProfileString("Service", "Service Name", "", sb, sb.Capacity, "setup.ini") 
    MessageBox.Show(readVal.ToString) 
End Sub 

dies jedoch nur „0“ zurück

Jede Hilfe dankbar sein würde, einen Weg zu finden, diese Lesung aus dem INI zu erhalten und

+0

Erwartet diese Zeile möglicherweise nicht eine Ordinalposition anstelle einer Zeichenfolge? 'ini.Sections (" Service "). Schlüssel (" Service Name ")' z.B. ini.Sektionen (1). usw. –

+0

'Dim readValue As String = ini.Sections (" Dienst "). Keys (" Dienstname ")' und Ihre 'GetPrivateProfileString-Funktion' als String nicht ganzzahlig. Sie können später von String in Integer konvertieren. – Claudius

+0

Einstellung sie als Typ String nicht funktioniert, immer noch der gleiche Fehler/Problem – Gaza

Antwort

2

Mit der gegebenen IniFile Klasse an der Registrierung Dumping, das wird Sie das bekommen config-Einstellwerte:

Private Sub INIButtonTest_Click(sender As Object, e As EventArgs) Handles INIButtonTest.Click 
    Try 

     Dim iniFilePath As String = "H:\Dev\StackOverflow\StackOverflowTest\StackOverflowApp\bin\Debug\test.ini" 

     Dim myIniFile As New IniFile 
     myIniFile.Load(iniFilePath) 

     Dim myValue As String = getIniValue(myIniFile, "Service", "Service Name") 

     If Not String.IsNullOrEmpty(myValue) Then 
      MessageBox.Show(String.Format("Found value: [{0}]", myValue)) 
     End If 

    Catch ex As Exception 
     MessageBox.Show(String.Concat("Something went wrong:", ex.Message)) 
    End Try 
End Sub 

Private Function getIniValue(iniFileInstance As IniFile, sectionName As String, sectionKey As String) As String 

    Dim myValue As String = String.Empty 

    For Each sect As IniFile.IniSection In iniFileInstance.Sections 
     If sect.Name = sectionName Then 
      For Each key As IniFile.IniSection.IniKey In sect.Keys 
       If key.Name = sectionKey Then 
        myValue = key.GetValue 
        Exit For 
       End If 
      Next 
      Exit For 
     End If 
    Next 

    Return myValue 

End Function 
2

Als alternative kann der Code für den ursprünglichen Ansatz ist sehr Nähe zu korrigieren, aber GetPrivateProfileString nicht wirklich existieren in Kernel32.dll. Sie benötigen einen W auf den Namen hinzuzufügen, die den korrigierten Code macht:

' With these imports 
Imports System.ComponentModel 
Imports System.Runtime.InteropServices 
Imports System.Text 

' Note the W on the function name 
Private Declare Auto Function GetPrivateProfileStringW Lib "kernel32" (ByVal lpAppName As String, 
    ByVal lpKeyName As String, 
    ByVal lpDefault As String, 
    ByVal lpReturnedString As StringBuilder, 
    ByVal nSize As Integer, 
    ByVal lpFileName As String) As Integer 


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim sb As New StringBuilder(500) 
    Dim result As Integer = GetPrivateProfileStringW("Service", "Service Name", "", sb, sb.Capacity, "setup.ini") 
    If result > 0 Then 
     MessageBox.Show(sb.ToString()) 
    Else 
     Dim ex As New Win32Exception(Marshal.GetLastWin32Error()) 
     MessageBox.Show(ex.Message) 
    End If 
End Sub 

Wenn Sie nicht lieber die W verwenden, oder Sie möchten, dass Ihre Funktion etwas anderes nennen, können Sie auch die DllImportAttribute und ändern können die Funktionsdeklaration an:

<DllImport("Kernel32.dll", CharSet:=CharSet.Auto, 
      SetLastError:=True, EntryPoint:="GetPrivateProfileStringW")> 
Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, 
               ByVal lpKeyName As String, 
               ByVal lpDefault As String, 
               ByVal lpReturnedString As StringBuilder, 
               ByVal nSize As Integer, 
               ByVal lpFileName As String) As Integer 
End Function