2008-09-24 9 views
5

Estaba retocando con llamar a GetPrivateProfileString y GetPrivateProfileSection en kernel32 desde .NET y encontré algo extraño que no entiendo.GetPrivateProfileString Oddity

Vamos a empezar con este encantation:

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 (sección) lpApplicationName, sin lpKeyName y sin lpDefault, que debería obtener todas las claves de esa sección, y de hecho lo hago: 50% del tiempo.

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

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

¿Qué me estoy perdiendo?

Respuesta

9

Compruebe si el archivo que está abriendo tiene un byte order mark (unos pocos bytes que marcan el tipo de codificación de texto).

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

+0

¿Hay alguna manera de decirle a Studio que deje de escribir BOMS para archivos de prueba simples? – claco

+1

No estaba al tanto del hecho de que la lista de materiales se infiltra subrepticiamente. Casi pasé una hora preguntándome qué estaba pasando antes de encontrar tu respuesta. ¡Estupendo! –

1

Buena llamada. La edición del archivo ini en VS.NET es, por supuesto, (Duh) agregando una BOM utf-8. Grrr. Al abrirlo en el bloc de notas y hacer un ASCII de SaveAs, se obtienen los resultados esperados.

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

Gracias! - = Chris

+0

Sí, ¡he perdido esa hora recientemente! No tengo una buena solución, lo más fácil es verificar el archivo manualmente antes de abrirlo y emitir un error, pero realmente no ayuda al usuario. –