Почему WritePrivateProfileString возвращает 0? - PullRequest
2 голосов
/ 21 февраля 2011

В моем приложении C # я хочу обновить значения в INI-файле.Я использовал услуги взаимодействия и хочу использовать функцию WritePrivateProfileString.Поэтому я импортировал DLL следующим образом:

[DllImport("KERNEL32.DLL", EntryPoint = "WritePrivateProfileStringW",
           SetLastError = true,
           CharSet = CharSet.Unicode, ExactSpelling = true,
           CallingConvention = CallingConvention.StdCall)]
private static extern int WritePrivateProfileString(
            string lpAppName,
            string lpKeyName,
            string lpString,
            string lpFilename);`

И использовал ее в своей функции следующим образом:

int result = WritePrivateProfileString(category, key, value, iniFile);

Но результат равен 0, а файл INI не обновляется.Как я могу проверить ошибку?

Ответы [ 3 ]

6 голосов
/ 21 февраля 2011
5 голосов
/ 21 февраля 2011

Назовите эквиваленты .NET для функций Win32 API GetLastError и FormatMessage, и система скажет вам, почему она не позволяет вам сделать это.

Коди, вероятно, прав, предполагая, что это связанов UAC, но не зная, где вы пытаетесь написать этот файл, мы можем только догадываться.

Обновление

Как было объяснено мне в комментариях,Marshal.GetLastWin32Error - это способ .NET получить код ошибки вместо непосредственного вызова GetLastError.Вызов GetLastError напрямую вернет код ошибки последнего вызова API Win32, который, скорее всего, был вызван во время выполнения .NET Win32, а не вашим P / Invoke.

2 голосов
/ 27 марта 2013

Файлы данных / параметров приложения должны быть сохранены в специальной папке приложения в специальной папке LocalApplicationData системы либо для конкретного пользователя, либо для всех пользователей.

Ваше приложение будет иметь соответствующие разрешения для записи здесь.Это может быть специальная папка для пользователя, поэтому настройки ini будут уникальными для каждого пользователя.

Вы можете извлечь специальную папку LocalApplicationData, используя:

string path = System.Environment.GetFolderPath(System.Environment.SpecialFolder.LocalApplicationData);

Создайте здесь папку для вашегоприложения и сохраните в нем свои INI-файлы.

В файловой системе специальная папка LocalApplicationData по умолчанию сопоставляется с:

(XP / 2k3) C: \ Documents and Settings \user_account \ Local Settings \ Application Data \

(Vista / 2k8 / 7/8) C: \ Users \ user_account \ AppData \ Local \

Комментарии относительно "ini-файлов не являютсярекомендовано ", но я не прав.

Если вам не нравится формат файла ini и API для строк PrivateProfile, то используйте файлы XML для настроек своего приложения или сверните свой собственный формат файла данных настроек.

Просто храните данные своего приложения в файлах в специальной папке LAD, а не в реестре.

Я рекомендую всем сторонним программным приложениям использовать папку LAD для данных / параметров инициализации для каждого пользователя aи не реестр.Системный реестр, как правило, заполняется ненужным мусором, так как многие программные приложения не очищают и не удаляют свои ключи реестра при обновлении или удалении.

...