代码之家  ›  专栏  ›  技术社区  ›  Vegar

如何检查应用程序是否从\程序文件运行\

  •  2
  • Vegar  · 技术社区  · 15 年前

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

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

    今天我们对启动路径和 CSIDL_PROGRAM_FILES 但是有件事告诉我这是一个非常不可靠的方法。

    有什么明智的解决方案吗? 是否有“isrunningfromprotectedfolder()”—我不知道的API? 是否有其他文件夹提供与程序文件相同的问题?

    3 回复  |  直到 13 年前
        1
  •  3
  •   Marius    15 年前

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

        2
  •  0
  •   Maksee    15 年前

    正如您所看到的,在处理UAC文件夹虚拟化时,我也发现了一些问题。我建议您采取一种解决方案,它似乎可以工作。

    它源于一个假设,即提升的进程总是使用原始拷贝,而不是虚拟拷贝(CMIIW)。另外,我假设您的安装进程是以提升的方式执行的

    其思想是创建一个“常规”进程(非提升的、遗留的),您的主安装程序应该运行该进程。这个过程将在用户选择的文件夹中创建一个文件名,其名称和内容是您的两个程序都知道的(例如,test73819704.bin)。如果文件夹已虚拟化,则此文件应显示在用户virtualstore中,而不应显示在原始文件夹中(从安装程序的角度和权限来看)。

    因此,对于选定的C:\程序\文件\但不必\和进程-1(提升)

    • process-1确保没有文件c:\program\u file s\u but\u not必然\test73819704.bin
    • 它在没有高度的情况下启动了Process-2
    • process-2创建c:\program_files_but_not必然\test73819704.bin并检查它是否真的存在。如果存在,它将返回一个良好的返回代码,否则返回一个“失败”的代码。
    • process-1等待process-2并分析结果。如果好的话,检查c:\program_files_but_not necessary\test73819704.bin,如果它存在,请选择“bin go”!没有发生虚拟化”,如果不存在,“坏,我们找一些其他存储位置”。如果来自进程2的代码是“失败”代码,请向用户显示一些错误消息。

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

        3
  •  0
  •   Nat    13 年前

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

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

    除此之外,它是一个简单的ini文件更改和一个用于移动数据的副本。

    在启动时,我们通过比较从shgetfolderpath(csidl_program_files)获得的值和可执行文件所在的路径的开头来检测是否在program files目录中。