5

.NET から kernel32 で GetPrivateProfileString と GetPrivateProfileSection を呼び出すことをいじっていたところ、理解できない奇妙なことに遭遇しました。

この呪文から始めましょう:

    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

lpApplicationName (セクション) を渡し、lpKeyName も lpDefault も渡さない場合、そのセクションのすべてのキーを取得する必要があり、50% の確率で取得します。

ini ファイルの lpApplicationName が最初の行から始まる場合、バッファーは何も返しません。ファイルの 2 行目に lpApplicationName stats がある場合、期待値が返されます。

最初は Declare で W 版と Unicode を使用する問題だと思っていましたが、それらを変更しても効果がないようです。

私は何が欠けていますか?

4

2 に答える 2

10

開いているファイルにバイト順マーク(テキストエンコーディングのタイプを示す数バイト)があるかどうかを確認します。

これらのWindowsAPI呼び出しは、バイト順マークを無視しているようには見えず、最初のセクションを見逃してしまいます(したがって、空白行がある場合はすべて正常に機能します)。

于 2008-09-24T01:00:17.757 に答える
1

良い電話。VS.NET で ini ファイルを編集することは、もちろん (Duh) utf-8 BOM を追加することです。うーん。メモ帳で開き、SaveAs ASCII を実行すると、期待どおりの結果が得られます。

とても明白です。とても鈍い。クラッパーをさらに1時間下ります。:-)

ありがとう!-=クリス

于 2008-09-24T01:06:43.840 に答える