GetPrivateProfileString Oddity
Pergunta
Eu só estava a remexer com a chamada GetPrivateProfileString e GetPrivateProfileSection em kernel32 de .NET e me deparei com algo estranho que eu não entendo.
Vamos começar com 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
Se eu passar um lpApplicationName (seção), não lpKeyName e nenhum lpDefault, eu deveria ter todas as chaves para essa seção, e na verdade eu faço:. 50% do tempo
Se o arquivo INI tem a lpApplicationName começando na primeira linha, o buffer retorna nada. Se lpApplicationName estatísticas sobre a segunda linha no arquivo, ele retorna os valores esperados.
No começo eu pensei que era uma questão de usar a versão W e Unicode na Declare, mas mudando as parece ter nenhum efeito.
O que eu estou ausente?
Solução
Verifique se o arquivo que você está abrindo tem uma byte order mark (a alguns bytes que marcam o tipo de codificação de texto).
Estas chamadas API do Windows não parecem Grokar marcas de ordem de bytes e é faz com que perca a primeira seção (daí tudo funciona bem se houver uma linha em branco).
Outras dicas
Boa chamada. Editando o arquivo ini em VS.NET é claro (Duh) adição de um BOM utf-8. Grrr. Abri-lo no bloco de notas e fazendo um SaveAs ASCII produz os resultados esperados.
Assim óbvio. Então obtuso. Mais uma hora para baixo a cagar. : -)
Obrigado! - = Chris