GetPrivateProfileString()返回空字符串,尽管有默认值

时间:2010-07-09 08:57:47

标签: vb.net visual-studio-2008

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”而不是默认值。

5 个答案:

答案 0 :(得分:3)

您必须在参数中设置大小,并为结果保留空间。 在调用函数之前插入这一行:

value = space(255)
length = len(value)

忘记了一些事情:你必须使用函数的返回值,因为这是你获得的实际值的长度,并使用Left(value,length)来得到真正的答案。

答案 1 :(得分:3)

确保INI文件的代码页是ANSI。 因为我的ini是UTF-8,所以我得到了空洞的结果。

对我来说并不明显。

答案 2 :(得分:2)

初始化lengthvalue如下:

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