检查用户定义的文件是否存在"安装位置"在C ++应用程序中

时间:2016-02-24 03:04:58

标签: c++ visual-studio visual-c++ wix wix3.8

我有一个使用WIX Toolkit构建的项目,它将一些组件部署为一个简单的安装程序包(MSI)的一部分:

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

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

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

  • 32位版本
    • 86
      • C:\ Program Files \ 42Chickens \ libtest
    • 64
      • C:\ Program Files(x86)\ 42Chickens \ libtest
  • 64位版本
    • 86
      • WON'安装
    • 64
      • C:\ Program Files \ 42Chickens \ libtest

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

所以,我尝试做的是在我的C ++库中确定安装了我的软件的libtest.dll,并检查override.raw的位置,如果它没有&#39 ; t存在于PWD中。

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

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

谢谢!

1 个答案:

答案 0 :(得分:2)

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