如何使用 GetPrivateProfileStringW 从 .ini 文件读取值
How to read values from .ini file with GetPrivateProfileStringW
我想从我的 ini 文件中获取数据,如下所示:
[UI]
visibility=hidden
size=medium
使用以下代码:
string section = "UI";
string key = "size";
string defaultValue "-";
string value = GetValueFromIni(section, key, defaultValue);
-----------------------------------------------------------------
this.filePath = @"C:\Users[=11=]372\test.ini";
public string GetValueFromIni(string section, string key, string defaultValue = "")
{
string value = string.Empty;
int i = GetPrivateProfileStringW(section, key, defaultValue, value, 255, this.filePath);
return value ?? defaultValue;
}
[DllImport("kernel32")]
private static extern int GetPrivateProfileStringW(string section, string key, string defaultValue, string value, int size, string filePath);
但是不行。
我总是得到默认值。
有人知道解决这个问题的方法吗?
干杯
至少,你的p/invoke签名是错误的。
lpReturnedString
是指向应写入结果的缓冲区的指针。 C# 字符串是不可变的,因此编组器不会改变您的 value
变量。相反,您应该使用 StringBuilder
:
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(
string section,
string key,
string defaultValue,
StringBuilder value,
int size,
string filePath);
用例如
调用它
var value = new StringBuilder(255);
int ret = GetPrivateProfileString(section, key, defaultValue, value, value.Capacity, this.filePath);
// TODO: Check 'ret'
return value.ToString();
总是值得检查 http://pinvoke.net 来寻找灵感,尽管对那里的签名持保留态度。
我还没有用你的输入测试过这个,所以我不能保证它有效。如果其他人提出了完整的解决方案,请接受他们的回答而不是我的。
我想从我的 ini 文件中获取数据,如下所示:
[UI]
visibility=hidden
size=medium
使用以下代码:
string section = "UI";
string key = "size";
string defaultValue "-";
string value = GetValueFromIni(section, key, defaultValue);
-----------------------------------------------------------------
this.filePath = @"C:\Users[=11=]372\test.ini";
public string GetValueFromIni(string section, string key, string defaultValue = "")
{
string value = string.Empty;
int i = GetPrivateProfileStringW(section, key, defaultValue, value, 255, this.filePath);
return value ?? defaultValue;
}
[DllImport("kernel32")]
private static extern int GetPrivateProfileStringW(string section, string key, string defaultValue, string value, int size, string filePath);
但是不行。
我总是得到默认值。
有人知道解决这个问题的方法吗?
干杯
至少,你的p/invoke签名是错误的。
lpReturnedString
是指向应写入结果的缓冲区的指针。 C# 字符串是不可变的,因此编组器不会改变您的 value
变量。相反,您应该使用 StringBuilder
:
[DllImport("kernel32")]
private static extern int GetPrivateProfileString(
string section,
string key,
string defaultValue,
StringBuilder value,
int size,
string filePath);
用例如
调用它var value = new StringBuilder(255);
int ret = GetPrivateProfileString(section, key, defaultValue, value, value.Capacity, this.filePath);
// TODO: Check 'ret'
return value.ToString();
总是值得检查 http://pinvoke.net 来寻找灵感,尽管对那里的签名持保留态度。
我还没有用你的输入测试过这个,所以我不能保证它有效。如果其他人提出了完整的解决方案,请接受他们的回答而不是我的。