2008-09-24 17 views
5

저는 .NET에서 GetPrivateProfileString과 GetPrivateProfileSection을 호출하는 방법을 고민 중이었습니다. 이해할 수없는 이상한 점이있었습니다.GetPrivateProfileString Oddity

의이 encantation 시작하자 : 실제로 내가 lpApplicationName (섹션)을 통과하면

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 

, 아니 lpKeyName없이 lpDefault, 나는 그 부분에 대한 키를 모두 얻을해야하고, 내가 할 : 50 % 그 시간의.

첫 번째 줄에서 시작하는 lpApplicationName이 ini 파일에있는 경우 버퍼는 아무 것도 반환하지 않습니다. 파일의 두 x 째 행에 lpApplicationName stats가 있으면 예상 값을 리턴합니다.

처음에는 Declare에서 W 버전과 Unicode를 사용했지만 그 변경은 아무 효과가없는 것 같습니다.

무엇이 누락 되었습니까?

답변

9

열려는 파일이 byte order mark (텍스트 인코딩 유형을 나타내는 몇 바이트)인지 확인하십시오.

이러한 Windows API 호출은 바이트 순서 표시를 깨우지 않으므로 첫 번째 섹션을 놓치게됩니다. 따라서 빈 줄이 있으면 모든 것이 올바르게 작동합니다.

+0

간단한 테스트 파일을 위해 BOMS 작성을 중단하도록 Studio에 지시하는 방법이 있습니까? – claco

+1

BOM이 은밀하게 들어온다는 사실을 알지 못했습니다. 나는 당신의 대답을 찾기 전에 무슨 일이 일어나는지 궁금해하는 시간을 거의 보냈다. 큰! –

1

전화하세요. VS.NET에서 ini 파일을 편집하는 것은 당연히 (Duh) utf-8 BOM을 추가하는 것입니다. Grrr. 메모장에서 열고 SaveAs ASCII를 수행하면 예상 된 결과가 나타납니다.

이렇게 분명합니다. 그래서 둔한. 사기꾼 또 다른 시간. :-)

고마워요! - = Chris

+0

예 - 최근에 그 시간을 잃어 버렸습니다! 좋은 해결책이 없다. 파일을 열기 전에 오류를 수동으로 확인하는 것이 가장 쉽지만 실제로는 도움이되지 않는다. –