2008-09-24 9 views
5

Ich habe gerade mit dem Aufruf von GetPrivateProfileString und GetPrivateProfileSection in Kernel32 aus .NET herumgebastelt und stieß auf etwas Seltsames, das ich nicht verstehe.GetPrivateProfileString Oddity

Beginnen wir mit diesem encantation starten:

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 

Wenn ich einen lpApplicationName (Abschnitt) passieren, kein lpKeyName und kein lpDefault, sollte ich alle Schlüssel für diesen Abschnitt erhalten, und in der Tat zu tun I: 50% der ganzen Zeit.

Wenn in der INI-Datei lpApplicationName in der ersten Zeile beginnt, gibt der Puffer nichts zurück. Wenn lpApplicationName in der zweiten Zeile der Datei steht, werden die erwarteten Werte zurückgegeben.

Zuerst dachte ich, es ginge nur darum, die W-Version und Unicode im Declare zu verwenden, aber das zu ändern scheint keine Wirkung zu haben.

Was fehlt mir?

Antwort

9

Überprüfen Sie, ob die zu öffnende Datei eine byte order mark enthält (einige Bytes, die den Typ der Textcodierung markieren).

Diese Windows-API-Aufrufe scheinen keine Byte-Reihenfolgezeichen zu erzeugen und verursachen, dass sie den ersten Abschnitt verpassen (daher funktioniert alles gut, wenn eine leere Zeile vorhanden ist).

+0

Gibt es eine Möglichkeit zu sagen, dass Studio aufhören soll, BOMS für einfache Testdateien zu schreiben? – claco

+1

Ich war mir nicht bewusst, dass die BOM heimlich einschleichen. Fast eine Stunde lang habe ich mich gefragt, was los ist, bevor ich deine Antwort gefunden habe. Groß! –

1

Guter Anruf. Das Bearbeiten der INI-Datei in VS.NET ist natürlich (Duh) Hinzufügen einer UTF-8-Stückliste. Grrr. Das Öffnen im Editor und das Ausführen eines SaveAs ASCII-Befehls liefert die erwarteten Ergebnisse.

So offensichtlich. So stumpf. Eine weitere Stunde den Crapper hinunter. :-)

Danke! - = Chris

+0

Ja - ich habe diese Stunde selbst vor kurzem verloren! Ich habe keine gute Lösung, am einfachsten ist es, die Datei manuell zu überprüfen, bevor Sie sie öffnen und einen Fehler ausgeben, aber dem Benutzer nicht wirklich hilft. –