2016-06-02 6 views
-1

INI 파일을 읽고 설치 응용 프로그램이 작동하도록 레지스트리에 값을 덤프하려고합니다. 이Visual Basic에서 INI 읽기 vb.net

[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 

그래서 나는 모든 항목을 쉽게 레지스트리에 덤프 될 필요가 같은

INI 파일 보인다.

Visual Studio 2015를 사용하고 있는데 Ludvik Jerabek의 INI 리더 (http://www.codeproject.com/Articles/21896/INI-Reader-Writer-Class-for-C-VB-NET-and-VBScript)를 사용하려고 시도했지만 기능이 제대로 작동하지 않았습니다! 내가 위의 사용 않았다

코드는 다음이었다

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

나는 다음과 같은 오류가있어이 코드를 실행 :. "변환은 문자열에서"서비스 "정수"를 입력하는 "유효하지 않습니다를 - 또한이 방법은 꽤 작업이 될 것 INI 파일에서 각각의 모든 키를 명명 의미

내가 여기에 일부 도움이 질문을 읽은 후 다른 방법을 내려 가서 내가 다음 사용!

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 

그러나 이것은 단지 "0"

어떤 도움이 읽는 INI에서 주어진 INIFILE 클래스를 사용하여 레지스트리

+0

이 줄은 문자열 대신에 서수 위치를 기대하지 않을까요? ini.Sections ("서비스"). 키 ("서비스 이름"). ini 섹션 (1). –

+0

'Dim readValue As String = ini.Sections ("서비스"). 키 ("서비스 이름")'및 GetPrivateProfileString 함수 (정수가 아닌 문자열). 나중에 문자열에서 정수로 변환 할 수 있습니다. – Claudius

+0

유형 문자열 작업을하지 않고 설정, 여전히 같은 오류/문제 – Gaza

답변

2

에 덤핑을 얻을 수있는 방법을 찾을 감사하겠습니다 반환, 이것은 당신을 얻을 것이다 구성 설정 값 : 대체로서

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

는, 원래의 접근 방식에 대한 코드 가까이 매우 정정이지만, Kernel32.dll에서 실제로 GetPrivateProfileString 존재하지 않습니다. 당신은 또한 DllImportAttribute 변경을 사용할 수 있습니다, 당신은 W를 사용하지 않으하거나 다른 함수 다르게 사용하고 싶다면

' 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 

: 당신은 수정 된 코드를 만드는 이름에 W를 추가해야 함수 선언은 다음과 같습니다.

<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