Private Declare Function GetPrivateProfileString Lib "kernel32" Alias _ "GetPrivateProfileStringA" (ByVal lpApplicationName As String, _ ByVal lpKeyName As String, _ ByVal lpDefault As String, _ ByVal lpReturnedString As String, _ ByVal nSize As Integer, ByVal lpFileName As String) As Integer
Dim value As String = ""
Dim length As Integer
Dim IniFileName As String
GetPrivateProfileString("Config", "UserName", "None", value, length, IniFileName)
但是value
包含一个空字符串!?
事实上,我认为是一个VB n00b,不到一周,但我看不出那里有什么问题。该文件存在,它包含一个名为“Config”的部分,其中有一个名为“UserName”的条目带有值 - 但即使不是,也不会value
采用默认值?
(并且,不,我不想使用注册表,谢谢;-)
编辑:它没有返回一个空字符串 - 它会在调用value
之前返回我初始化GetPrivateProfileString()
的任何内容。
这就是说,如果我
Dim value As String = "xxx"
然后stil在调用后包含“xxx”而不是默认值。
答案 0 :(得分:3)
您必须在参数中设置大小,并为结果保留空间。 在调用函数之前插入这一行:
value = space(255)
length = len(value)
忘记了一些事情:你必须使用函数的返回值,因为这是你获得的实际值的长度,并使用Left(value,length)
来得到真正的答案。
答案 1 :(得分:3)
确保INI文件的代码页是ANSI。 因为我的ini是UTF-8,所以我得到了空洞的结果。
对我来说并不明显。
答案 2 :(得分:2)
初始化length
和value
如下:
Dim length As Integer = 255
Dim value As String = New String(" "c, length)
另外,根据您发布的代码,IniFileName
似乎是空的。也许你需要在那里分配一个值?
答案 3 :(得分:1)
供参考:
如果您的默认值为“”,并且您提供的文件名不存在,或者提供没有完整路径的文件名,您也会得到一个空字符串。 GetPrivateProfileString()如果找不到源文件并且只使用默认值,则不会返回错误。
答案 4 :(得分:0)
看看PInvoke.net处的示例,您用于调用GetPrivateProfileString的签名不太正确。具体来说,PInvoke.net上显示的签名通过StringBuilder和stringbuilder的大小。
在你的例子中,你传递一个空字符串和一个零长度,所以对GetPrivateProfileString的调用只会返回一个空(零长度)字符串,因为你告诉它输出缓冲区(值)你传入的是适合零长度的字符串。
要获得您期望的结果,您的代码必须是:
Imports System.Runtime.InteropServices
Imports System.Text
Module Module1
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
Sub Main()
Dim value as String
Dim result As Integer
Dim sb As StringBuilder
Dim IniFileName As String = "PathAndFilenameGoesHere"
sb = New StringBuilder(300)
result = GetPrivateProfileString("Config", "UserName", "", sb, sb.Capacity,IniFileName)
value = sb.ToString()
End Sub
End Module