2008-09-24 5 views
5

Je ne faisais que bricoler en appelant GetPrivateProfileString et GetPrivateProfileSection dans kernel32 de .NET et suis tombé sur quelque chose d'étrange que je ne comprends pas.GetPrivateProfileString Oddity

Commençons par ce 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 je passe une lpApplicationName (section), pas lpKeyName et pas lpDefault, je devrais obtenir toutes les clés de cette section, et en fait je fais: 50% du temps.

Si le fichier ini a lpApplicationName à partir de la première ligne, le tampon ne renvoie rien. Si lpApplicationName est affiché sur la deuxième ligne du fichier, il renvoie les valeurs attendues. Au début, je pensais que c'était une question d'utiliser la version W et Unicode dans le Declare, mais changer cela semble n'avoir aucun effet.

Qu'est-ce qui me manque?

Répondre

9

Vérifiez si le fichier que vous ouvrez a un byte order mark (quelques octets marquant le type d'encodage de texte).

Ces appels d'API Windows ne semblent pas altérer les marques d'ordre des octets et leur font manquer la première section (tout fonctionne donc correctement s'il y a une ligne vide).

+0

Existe-t-il un moyen de dire à studio d'arrêter d'écrire BOMS pour des fichiers de test simples? – claco

+1

Je n'étais pas au courant du fait que la nomenclature se glisse subrepticement. J'ai presque passé une heure à me demander ce qui se passait avant de trouver votre réponse. Génial! –

1

Bon appel. L'édition du fichier ini dans VS.NET est bien sûr (Duh) l'ajout d'une nomenclature utf-8. Grrr. L'ouvrir dans le bloc-notes et faire un SaveAs ASCII donne les résultats attendus.

Tellement évident. Tellement obtus. Une autre heure dans le crapper. :-)

Merci! - = Chris

+0

Ouais - j'ai perdu cette heure moi-même récemment! Je n'ai pas une bonne solution, la plus simple est de vérifier le fichier manuellement avant de l'ouvrir et d'émettre une erreur, mais cela n'aide pas vraiment l'utilisateur. –