检查文件是否存在于应用程序中的用户定义"Install Location" C++

Check if file exists in user-defined "Install Location" in C++ application

本文关键字:定义 用户 Install C++ Location 是否 文件 存在 应用程序 检查      更新时间:2023-10-16

我有一个使用 WIX 工具包构建的项目,该项目部署了一些组件作为简单安装程序包 (MSI) 的一部分:

  • 图书馆,libtest.dll
  • 库的头文件,libtest.h
  • 一个简单的应用程序来练习库,libtest_example.exe

我在libtest.dll中有一个功能,它没有直接向用户公开,它检查PWD(当前工作目录)中名为override.raw的文件。如果此文件存在,则libtest_example.exe使用的libtest.dll中的正常初始化代码的行为将有所不同(即:如果应用程序从控制台启动,则启用调试日志记录到控制台)。

我想将一个功能集成到libtest.dll中,以便如果它在PWD中找不到override.raw,它会检查 MSI 软件包的安装位置。这是我为 x86 和 x64 编译的包,因此默认位置为:

  • 32 位版本
    • x86
      • C:\程序文件\42鸡\libtest
    • x64
      • C:\程序文件 (x86)\42Chickens\libtest
  • 64 位版本
    • x86
      • 不会安装
    • x64
      • C:\程序文件\42鸡\libtest

当然,用户可以更改默认安装位置。

因此,我要做的是在我的C++库中确定libtest.dll,我的软件安装到的位置,并检查该位置是否有override.raw,如果它在 PWD 中不存在。

有没有一种微不足道的方法可以做到这一点?更好的是,有没有办法将我的WIX项目中的一些文件直接包含在我的C++源中,这样我只需要在一个位置更改值?我最好的猜测是我正在从WIX项目中查询某种GUID/UUID值,并使用Windows系统调用或Windows SDK命令根据密钥查询注册表项,但这就是我所得到的。

我还写了一个混乱的例子,其中WIX添加了额外的注册表项,但它们似乎在系统与系统之间并不相同,因此我正在寻求适用于Windows XP,Vista,7,8.x和10的便携式解决方案的帮助。

谢谢!

您可以使用 MsiGetComponentPath MSI API 函数获取组件(通常是文件)的密钥路径。您也可以将用户选择的安装目录写入注册表,并从初始化代码中查询该目录。这可能更容易,并且不需要协调产品代码和组件 GUID。