2008-09-24 48 views
5

我只是在修补kernel32中的.NET的GetPrivateProfileString和GetPrivateProfileSection,并发现了一些奇怪的东西,我不明白。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在文件的第二行进行统计,它将返回预期值。

起初我虽然是在Declare中使用W版本和Unicode,但改变这些似乎没有效果。

我错过了什么?

回答

9

检查您正在打开的文件是否有byte order mark(标记文本编码类型的几个字节)。

这些Windows API调用似乎没有帮助字节顺序标记,并导致它们错过了第一部分(因此,如果有空行,一切工作正常)。

+0

有没有办法让工作室停止为简单测试文件编写BOMS? – claco 2008-09-24 01:16:09

+1

我没有意识到BOM暗中偷偷的事实。我几乎花了一个小时想知道发生了什么,然后才找到答案。大! – 2010-11-20 09:24:24

1

良好的通话。编辑VS.NET中的ini文件当然是(Duh)添加utf-8 BOM。哎呀。 在记事本中打开它并执行SaveAs ASCII操作会产生预期结果。

很明显。所以懒惰。在垃圾箱下一小时。 :-)

谢谢! - = Chris