2008-09-24 6 views
5

Я просто занимался вызовом GetPrivateProfileString и GetPrivateProfileSection в kernel32 из .NET и столкнулся с чем-то странным, которого я не понимаю.GetPrivateProfileString Oddity

Давайте начнем с этого 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 

Если я передать (раздел) lpApplicationName, не lpKeyName и не lpDefault, я должен получить все ключи для этого раздела, и на самом деле я: 50% времени.

Если файл ini имеет имя lpApplicationName, начинающееся с первой строки, буфер ничего не возвращает. Если значение lpApplicationName указано во второй строке файла, оно возвращает ожидаемые значения.

Сначала я решил использовать версию W и Unicode в объявлении, но изменение их, похоже, не имеет эффекта.

Что мне не хватает?

ответ

9

Проверьте, есть ли файл, который вы открываете, byte order mark (несколько байтов, обозначающих тип текстовой кодировки).

Эти вызовы Windows API, похоже, не задоривают байтовые байты заказа и заставляют их пропустить первый раздел (следовательно, все работает отлично, если есть пустая строка).

+0

Есть ли способ сказать студии прекратить писать BOMS для простых тестовых файлов? – claco 2008-09-24 01:16:09

+1

Мне не было известно о том, что спецификация ползает тайно. Я почти потратил час, задаваясь вопросом, что происходит, прежде чем я нашел ваш ответ. Большой! – 2010-11-20 09:24:24

1

Хороший звонок. Редактирование ini-файла в VS.NET, конечно, (Duh) добавляет спецификацию utf-8. Хмм. Открытие его в блокноте и выполнение SaveAs ASCII дает ожидаемые результаты.

Такой очевидный. Так тупо. Еще час позади. :-)

Спасибо! - = Chris