我正在调用CreateFile()来在Program Data目录中创建一个文件。我正在使用SHGetSpecialFolderPath()来获取目录名称。

我有一个Vista用户,CreateFile()返回错误5(拒绝访问)。如果我知道CreateFile()实际上是在尝试创建文件,那么我们可以检查他的文件夹权限。 Vista(UAC)的问题是,它没有尝试在我传入的目录中创建文件。它也可能位于VirtualStore目录中。另一个混乱的来源是这个用户是德语,虽然SHGetSpecialFolderPath()返回“C:\ Program Data \ blah blah”作为路径,我不认为这实际上是路径所在。我认为德语Vista使用德语单词“Program Data”。我希望能够告诉用户“这是我们尝试创建文件的确切路径。检查您对此文件夹的权限。“

我知道你可以从一个打开的文件句柄获取一个路径,但在这种情况下,CreateFile()失败,所以我没有一个打开的句柄。如何让Vista告诉我它尝试创建文件的实际路径?

有帮助吗?

解决方案

启动进程监视器并观察它的作用: http://technet.microsoft.com/en-us/sysinternals/bb896645。 ASPX

其他提示

如果使用UAC所使用的路径不是您想要的路径,则重定向有效。 要确保不会发生重定向,请添加清单到您的应用程序,向Vista表明您的应用程序已正确编码并知道访问限制(即,您不写入例如HKLM或程序文件夹,如果您的应用不需要管理员权限即可运行。

但您的应用程序应该能够写入APPDATA文件夹(如果这是您真正使用的)。

确保您使用的是CSIDL_APPDATA,而不是CSIDL_COMMON_APPDATA(后者只能使用管理员权限访问)。

要查找真实路径(您期望的路径),请告诉用户在浏览器栏中输入%APPDATA%(或点击Windows + R,然后输入%APPDATA%,输入)。这将打开该文件夹上的资源管理器。

我的理解是Vista使用ProgramData来编写试图写在C:\ Program Files中的文件,但是失败了,因为除非您以管理员身份运行应用程序,否则无法在程序文件中编写。也许您应该尝试将文件保存到当前用户下的AppData文件夹中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top