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