我正在尝试读取INI文件,然后将值转储到注册表中以使设置应用程序正常运行。
INI文件看起来像这样
[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
所以我需要将所有这些项目轻松地转储到注册表中。
我正在使用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)
运行此代码时出现以下错误:“从字符串”Service“转换为”Integer“类型无效。 - 此方法意味着命名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获取此数据并转储到注册表
答案 0 :(得分:2)
使用给定的IniFile类,这将使您进入配置设置值:
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
答案 1 :(得分:2)
作为替代方案,原始方法的代码非常接近正确,但Kernel32.dll中实际上并不存在import os
conf=os.environ
。您需要在名称中添加一个W,这将生成更正后的代码:
GetPrivateProfileString
如果您不想使用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
并将函数声明更改为:
DllImportAttribute
答案 2 :(得分:0)
这是我从VB 3.0开始使用的东西,并且从3.1开始就可以在所有Windows版本中使用。进行了一些修改以使其适合较新的dev工具的约定,但本质上它们是相同的例程。
这些必须在公共班级或以下形式的公共区域中:
公共声明函数OSGetPrivateProfileString%Lib“ kernel32”别名“ GetPrivateProfileStringA”(ByVal AppName作为字符串,ByVal KeyName作为字符串,ByVal keydefault作为字符串,ByVal ReturnString作为字符串,ByVal NumBytes作为整数,ByVal FileName作为字符串)
公共声明函数OSWritePrivateProfileString Lib“ kernel32”别名“ WritePrivateProfileStringA”(ByVal AppName作为字符串,ByVal KeyName作为字符串,ByVal keydefault作为字符串,ByVal FileName作为字符串)作为整数
然后,在表单代码区中的某个地方,或者如果您有一个“ functions.vb”类(将在上面声明上述内容的地方),请放置以下两个:
公共共享函数GetINIString(ByVal strItem作为字符串,ByVal strDefault作为字符串,ByVal strSection作为字符串,ByVal文件名作为字符串)作为字符串
Const BUFFERSIZE As Integer = 16768
Dim strTemp As New String(Chr(0), BUFFERSIZE)
Dim stringSize As Long = 0
stringSize = OSGetPrivateProfileString%(strSection, strItem, strDefault, strTemp, BUFFERSIZE, filename)
Return Strings.Left(strTemp, stringSize)
结束功能
AND
公共共享子PutINIString(strItem作为字符串,strValue作为字符串,strSection作为字符串,iniFilename作为字符串)
Dim i As Integer = 0
i = OSWritePrivateProfileString(strSection, strItem, strValue, iniFilename)
结束子
这在VB 2010中继续有效