【问题标题】:How to read values from .ini file with GetPrivateProfileStringW如何使用 GetPrivateProfileStringW 从 .ini 文件中读取值
【发布时间】:2025-12-22 11:30:11
【问题描述】:

我想从我的 ini 文件中获取数据,如下所示:

[UI]
visibility=hidden
size=medium

使用以下代码:

string section = "UI";
string key = "size";
string defaultValue "-";

string value = GetValueFromIni(section, key, defaultValue);

-----------------------------------------------------------------

this.filePath = @"C:\Users\00372\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);

但它不会起作用。

我总是得到默认值。

有人知道解决办法吗?

干杯

【问题讨论】:

    标签: c# .net ini


    【解决方案1】:

    至少,您的 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 的灵感总是值得的,尽管那里的签名是有保留的。

    我没有根据您的输入对此进行测试,所以我不能保证它有效。如果其他人提出了完整的解决方案,请接受他们的回答而不是我的回答。

    【讨论】:

    • 谢谢,但这也没有给我价值。值只是一个空字符串。
    • 哦,好吧,这至少是问题的部分。更新澄清。
    • 您认为ret 有什么价值?
    • 没关系,我忘了从 GetPrivateProfileStringW 中删除“W”。它现在可以工作了:)
    • 是的,编组器有利于选择正确的 A/W 变体