GetPrivateProfileString () возвращает пустую строку, несмотря на наличие по умолчанию - PullRequest
2 голосов
/ 09 июля 2010
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().

То есть, если I

Dim value As String = "xxx"

, то после вызова он все еще содержит «xxx», а не значение по умолчанию.

Ответы [ 5 ]

3 голосов
/ 10 декабря 2015

Убедитесь, что кодовая страница вашего INI-файла является ANSI. Я получал пустые результаты, потому что мой INI был в UTF-8.

не было для меня очевидным.

3 голосов
/ 09 июля 2010

Вы должны установить размер в параметрах и зарезервировать место для результата. Вставьте следующие строки перед вызовом функции:

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

Забыл что-то: вы должны использовать возвращаемое значение функции, так как это длина фактического значения, которое вы получаете, и использовать Left(value,length), чтобы получить реальный ответ.

2 голосов
/ 09 июля 2010

Инициализируйте length и value следующим образом:

Dim length As Integer = 255
Dim value As String = New String(" "c, length)

Также, согласно указанному вами коду, IniFileName кажется пустым.Может быть, вам тоже нужно присвоить значение?

1 голос
/ 20 марта 2013

FYI:

Вы также получаете пустую строку, если по умолчанию установлено "", и вы указываете имя файла, которого не существует, или предоставляете имя файла без полного пути. GetPrivateProfileString () не возвращает ошибку, если не может найти исходный файл, а просто использует значение по умолчанию.

0 голосов
/ 09 июля 2010

Посмотрите на пример на PInvoke.net , подпись, которую вы используете для вызова GetPrivateProfileString, не совсем верна.В частности, подпись, показанная на PInvoke.net, проходит через 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...