【问题标题】:GetPrivateProfileString not working .NETGetPrivateProfileString 不工作.NET
【发布时间】:2013-07-02 09:44:01
【问题描述】:

我想用GetPrivateProfileString 做一个INI 阅读器。我正在使用什么:

public class Config
{
    [DllImport("kernel32")]
    private static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

    private string path;

    public Config(string path)
    {
        this.path = path;
    }

    public string PopValue(string section, string key)
    {
        StringBuilder sb = new StringBuilder();
        GetPrivateProfileString(section, key, "", sb, sb.Length, path);
        return sb.ToString();
    }
}

现在是我的 INI 文件:

[mysql]
host=localhost

以及我使用的:

Console.WriteLine(Configuration.PopValue("mysql", "host"));

但是,它只是打印出一个空行而不是localhost。我做错了什么?

【问题讨论】:

  • 从不使用 GetPrivateProfileString(),由于它的 appcompat 行为,它非常昂贵。读取一个 single ini 参数需要 50 毫秒。阅读其中的 20 篇,你已经浪费了你的启动时间。格式很简单,很容易用 StreamReader 解析自己。

标签: c# kernel32


【解决方案1】:

是的,如果您愿意,可以使用 StringBuilder,解决方案如下:

[DllImport("kernel32")]
private static extern int GetPrivateProfileString(string Section, string Key, string Default, StringBuilder RetVal, int Size, string FilePath);

public string PopValue(string section, string key)
{
    StringBuilder sb = new StringBuilder(4096);
    int n = GetPrivateProfileString(section, key, "", sb, 4096, path);
    if(n<1) return string.Empty;
    return sb.ToString();
}

问题是你在传递 sb.Length 时传入了一个零长度,它被导入的函数解释为没有用于写入返回值的空间 - 所以它什么也没写。

【讨论】:

  • path 在哪里定义?作为GetPrivateProfileString()的最后一个参数列出的那个?
  • path 是文件名的完整路径,例如"C:\Tmp\MySettings.ini"
【解决方案2】:

如果您可以使用第三方库,请尝试使用Nini。 我使用它,非常容易创建/管理复杂的 INI 文件,并且是开源的。

GetPrivateProfileString签名是

DWORD WINAPI GetPrivateProfileString(
  _In_   LPCTSTR lpAppName,
  _In_   LPCTSTR lpKeyName,
  _In_   LPCTSTR lpDefault,
  _Out_  LPTSTR lpReturnedString,
  _In_   DWORD nSize,
  _In_   LPCTSTR lpFileName
);

所以out不是StringBuilder使用String

【讨论】:

  • Nini 工作正常,我想我会使用 Nini,它更容易:) 谢谢。
  • 你可以使用StringBuilder作为out参数
猜你喜欢
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多