GetPrivateProfileString无法运行.NET

时间:2013-07-04 11:41:25

标签: c# kernel32

我想用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。我做错了什么?

2 个答案:

答案 0 :(得分:6)

是的,如果您愿意,可以使用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时你传入了一个零长度,并且导入的函数解释了没有空格来写入返回值 - 所以它什么都没写。

答案 1 :(得分:1)

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

GetPrivateProfileString签名

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

因此StringBuilder使用String