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)

pero value contiene una cadena vacía!?

Me confes a ser un VB n00b, a menos de una semana, de hecho, pero no puedo ver lo que está mal allí. El archivo existe, contiene una sección llamada «Config», que tiene una entrada llamada «nombre de Usuario» con un valor – pero incluso si no, no value tomar el valor predeterminado?

(Y, no, no quiero utilizar el registro, gracias 😉


Edit: no devolver una cadena vacía – es devolver todo lo que me inicializar value para antes de llamar a GetPrivateProfileString().

Es decir, que si yo

Dim value As String = "xxx"

entonces stil contiene «xxx» después de la llamada y no el valor predeterminado.

Traté de empujar la declaración de la función en el código de bloque, pero por alguna razón no está teniendo nada de eso – por si acaso usted se preguntaba por qué me había editado tu pregunta 🙂

OriginalEl autor Mawg | 2010-07-09

5 Comentarios

  1. 3

    Usted tiene que fijar el tamaño de la params, y espacio de reserva para el resultado.
    Insertar estas líneas antes de la llamada a la función:

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

    Olvidó algo: usted tiene que utilizar el valor de retorno de la función, ya que esta es la longitud del valor real de conseguir, y el uso de un Left(value,length) para obtener su respuesta real.

    OriginalEl autor dwo

  2. 3

    Asegúrese de que la página de códigos de la INI-archivo ANSI.
    Yo estaba vacío resultados porque mi ini estaba en UTF-8.

    No era obvio para mí.

    He creado un archivo ini en Visual Studio. Lo de poner 3 bytes al principio del archivo que se rompió esta función. Me tomó 45 minutos para averiguarlo. Después de mirar el archivo en HexEdit (y viendo este comentario anterior, me elimine el archivo y re-creado en Sublime Text. Funcionó a la perfección. No utilice el VS editor de texto!
    Esto tomó un tiempo para encontrar! Muchas gracias a usted salvó mi día!

    OriginalEl autor hypers

  3. 2

    Inicializar length y value de la siguiente manera:

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

    También, según el código que has publicado, IniFileName parece vacía. Tal vez usted necesita para asignar un valor allí también?

    OriginalEl autor Anax

  4. 1

    FYI:

    Usted también consigue una cadena vacía si el defecto es «» y que proporcione un nombre de archivo que no existe, o proporcionar un nombre de archivo sin la ruta de acceso completa. GetPrivateProfileString() no devuelve un error si no puede encontrar el archivo de origen y sólo utiliza el valor predeterminado.

    OriginalEl autor Sam Jones

  5. 0

    Echa un vistazo al ejemplo en PInvoke.net, la firma que está utilizando para llamar GetPrivateProfileString no está muy bien. En concreto, la firma que se muestra en PInvoke.net pasa a través de un StringBuilder y el tamaño de la stringbuilder.

    En tu ejemplo, que está pasando a través de una cadena vacía y una longitud cero, por lo que la llamada a GetPrivateProfileString sólo devolver un vacío (longitud cero) de la cadena, debido a que usted está diciendo es que el búfer de salida (valor) a la que está pasando es adecuado para una cadena de longitud cero.

    Para obtener el resultado que usted está esperando, su código por lo tanto debe ser:

    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
    -1: yo miraba el uso de la pinvoke firma, luego pasó a la OP firma que requiere menos código y funciona sin problemas

    OriginalEl autor Rob

Dejar respuesta

Please enter your comment!
Please enter your name here