Pregunta

Estaba jugando con las llamadas a GetPrivateProfileString y GetPrivateProfileSection en kernel32 desde .NET y encontré algo extraño que no entiendo.

Empecemos con este encantamiento:

    Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" ( _
    ByVal lpApplicationName As String, _
    ByVal lpKeyName As String, _
    ByVal lpDefault As String, _
    ByVal lpReturnedString() As Char, _
    ByVal nSize As Int32, _
    ByVal lpFileName As String) As Int32

Si paso un lpApplicationName (sección), ni lpKeyName ni lpDefault, debería obtener todas las claves para esa sección, y de hecho las obtengo:50% del tiempo.

Si el archivo ini tiene lpApplicationName comenzando en la primera línea, el búfer no devuelve nada.Si lpApplicationName presenta estadísticas en la segunda línea del archivo, devuelve los valores esperados.

Al principio pensé que era cuestión de usar la versión W y Unicode en Declare, pero cambiarlos parece no tener ningún efecto.

¿Qué me estoy perdiendo?

¿Fue útil?

Solución

Verifique si el archivo que está abriendo tiene un marca de orden de bytes (unos pocos bytes que marcan el tipo de codificación del texto).

Estas llamadas a la API de Windows no parecen asimilar las marcas de orden de bytes y esto hace que se pierdan la primera sección (por lo tanto, todo funciona bien si hay una línea en blanco).

Otros consejos

Buena llamada.Editar el archivo ini en VS.NET es, por supuesto (Duh), agregar una lista de materiales utf-8.Grrr.Abrirlo en el bloc de notas y guardar como ASCII produce los resultados esperados.

Tan obvio.Tan obtuso.Otra hora más abajo en la basura.:-)

¡Gracias!-=cris

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top