2

是否有可靠的方法来检查应用程序是否从程序文件下方的某处运行?

如果用户在本地机器上安装应用程序来编写文件,我们需要将可写文件放在其他地方,以避免在 Vista 和 Win7 上进行虚拟化。但是,当安装到网络磁盘时,我们希望将这些文件与安装一起保存,以便用户之间共享访问。

今天我们在启动路径和 之间做一个字符串比较CSIDL_PROGRAM_FILES,但有件事告诉我这是一个非常不可靠的方法。

有什么聪明的解决方案吗?是否有我不知道的“IsRunningFromProtectedFolder()”-api?是否有任何其他文件夹会出现与程序文件相同的问题?

4

3 回答 3

3

这不是一个非常好的主意,因为用户可以将它安装在他们想要的任何地方,然后检查可能会失败。而是在用户安装应用程序时有一个复选框,以决定它是安装在本地还是在服务器上。

于 2009-12-10T08:51:35.300 回答
0

正如您一样,我还发现了处理 UAC 文件夹虚拟化的问题。我建议一种解决方法,它似乎应该可以工作。

它来自假设提升的进程总是使用原始副本而不是虚拟副本 (CMIIW)。此外,我假设您已处理的设置已提升执行

这个想法是创建一个“通用”进程(非提升,遗留),你的主安装程序应该运行。此过程将在用户选择的文件夹中创建一个文件名,该文件名具有您的程序都知道的名称和内容(例如,test73819704.bin)。如果文件夹被虚拟化,这个文件应该出现在用户 VirtualStore 中,而不应该出现在原始文件中(从安装程序的角度和权限的角度来看)。

所以对于选择的 C:\Program_Files_But_Not_Necessarily 和 Process-1(提升)

  • Process-1 确保没有文件 C:\Program_Files_But_Not_Necessarily\test73819704.bin
  • 它启动没有提升的 Process-2
  • Process-2 创建 C:\Program_Files_But_Not_Necessarily\test73819704.bin 并检查它是否真的存在。如果存在,它将返回一个良好的返回代码,否则返回一个“失败”的代码。
  • Process-1 等待 Process-2 并分析结果。如果好,检查 C:\Program_Files_But_Not_Necessarily\test73819704.bin,如果存在,选择“Bingo!没有发生虚拟化”,如果不存在,“不好,让我们找一些其他的存储位置”。如果 Process-2 中的代码是“失败”的,则向用户显示一些错误消息。

不幸的是,我现在无法测试它,但我想它应该可以工作,并且这背后有一个逻辑,使用 Process-2 你只是模拟你的主程序的行为)

于 2009-12-10T13:34:22.750 回答
0

我们允许我们的用户在任何地方安装...

如果用户采用默认设置,并且安装在 Program Files 中,我们假设我们需要写入 Documents and Settings/Users。否则,我们将数据写入软件所在目录下的文件夹。这当然仍然会导致问题,并且安装确实允许人们选择不同的数据位置,如果他们选择不使用默认值。

最重要的是,这是一个简单的 ini 文件更改和移动数据的副本。

在启动时,我们通过比较从 SHGetFolderPath(CSIDL_PROGRAM_FILES) 获得的值与可执行文件所在路径的开头来检测我们是否在 Program Files 目录中。

于 2012-04-11T02:57:23.917 回答