Как считывать значения из файла .ini с помощью GetPrivateProfileStringW

#c# #.net #ini

#c# #.net #ini

Вопрос:

Я хочу получить данные из моего ini-файла, который выглядит следующим образом:

 [UI]
visibility=hidden
size=medium
  

с помощью следующего кода:

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

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

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

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

Но это не сработает.

Я всегда получаю значение по умолчанию.

Кто-нибудь знает решение этой проблемы?

Приветствия

Ответ №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 для вдохновения, хотя отнеситесь к подписям там с недоверием.

Я не тестировал это с вашим вводом, поэтому не могу гарантировать, что это работает. Если кто-то другой предложит полное решение, пожалуйста, примите его ответ вместо моего.

Комментарии:

1. Спасибо, но это тоже не дает мне значения. Значение — это просто пустая строка.

2. Ну что ж, это, по крайней мере, часть проблемы. Обновлено для уточнения.

3. Какое значение вы видите ret ?

4. Неважно, я забыл удалить «W» из GetPrivateProfileStringW. Теперь это работает 🙂

5. Да, маршаллер хорош в выборе правильного варианта A / W