0

我有一个旧的 c++ 应用程序需要修改才能与 Windows 7 一起使用。问题在于创建一个新文件夹并将文件保存在该文件夹中。该文件夹应创建于

c:\程序文件\myApp\data\newFolder。

这是我用来创建新文件夹并得到错误的函数:

if(!CreateDirectory(pathSamples,NULL))  //Throw Error
 {
  DWORD errorcode = GetLastError(); 
  LPVOID lpMsgBuf;

  FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
       NULL, errorcode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&lpMsgBuf, 0, NULL );

  MessageBox(NULL, (LPCTSTR)lpMsgBuf, TEXT("Error"), MB_OK);
 }

在 XP 中这有效,但在 Windows 7 中则无效。如果我以管理员身份运行应用程序,则会创建文件夹,否则会引发“访问被拒绝”错误。

我的问题如下:
是否可以选择更改代码,以便可以在“程序文件”中创建文件夹,并且可以将文件保存在此文件夹中?

PS我已经看到了这个帖子,但它没有回答我的问题。

谢谢,
伊利亚

4

5 回答 5

3

正如其他人已经写的那样, %ProgramFiles% 不是存储用户数据的正确位置。显然,正确的解决方案是重新设计应用程序,使其使用不同的存储位置。

作为替代方案,存在一个快速而肮脏的(!)修复:如果应用程序没有清单,则用户帐户控制数据重定向启动,透明地将写入请求重定向到系统区域到用户配置文件中的安全位置。重定向目标是 %LocalAppData%\VirtualStore\Program Files。可以在此处找到有关这种内置虚拟化的详细信息。

因此,您只需从应用程序中删除清单即可完成。

于 2011-01-05T10:14:40.320 回答
3

你已经回答了你自己的问题。您需要成为管理员才能在 Windows 7 中的 Program Files 下编写。

应用程序数据位于 Users//AppData 等下的不同区域...

您始终可以使用注册表选择写入位置,因此您可以在 XP 上使用旧区域,在 Vista 和 Windows 7 上使用新区域。

于 2011-01-05T09:59:32.743 回答
3

在 Vista 和以后的用户访问受限的情况下,您不想尝试将文件放在“程序文件”或任何其他非标准位置。您确实应该使用SHGetFolderPath从系统中获取正确的位置。

于 2011-01-05T10:06:50.373 回答
1

正如@CashCow所写:

您需要成为管理员才能在 Windows 7 中的 Program Files 下编写。

最好的方法是提升您的流程(使用ShellExecute "runas"或类似),然后创建文件夹。

一些ShellExecute例子:

于 2011-01-05T10:12:32.197 回答
0

看起来在安装程序中设置此文件夹的权限就足够了,现在它可以正常工作了。

谢谢大家的回答!

于 2011-01-05T14:11:13.623 回答