为什么WritePrivateProfileString返回0?

时间:2011-02-21 07:13:24

标签: c# .net winapi dllimport ini

在我的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 个答案:

答案 0 :(得分:6)

Marshal.GetLastWin32Error可以帮到你。

答案 1 :(得分:5)

将.NET等效项称为Win32 API函数GetLastErrorFormatMessage,系统会告诉您为什么不让它这样做。

Cody可能正确地猜测它与UAC有关,但是如果不知道你在哪里写这个文件,我们只能猜测。

更新

正如我在评论中向我解释的那样,Marshal.GetLastWin32Error是获取错误代码而不是直接调用GetLastError的.NET方法。直接调用GetLastError将返回最新调用Win32 API的错误代码,这可能是从.NET运行时调用Win32而不是P / Invoke。

答案 2 :(得分:2)

应将应用程序数据/参数文件保存到系统的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文件”的评论是错误的。

如果您不喜欢用于PrivateProfile字符串的ini文件格式和API,则使用XML文件进行应用设置,或者滚动您自己的设置数据文件格式。

只需将您的应用程序数据保存在LAD特殊文件夹中的文件中,而不是在注册表中。

我建议所有第三方软件应用程序对每个用户初始化数据/参数使用LAD文件夹而不是注册表。由于许多软件应用程序在执行升级或卸载时不清理并删除其注册表项,因此系统注册表往往会被遗留垃圾填满。