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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top