检查 C++ 应用程序中用户定义的 "Install Location" 中是否存在文件
Check if file exists in user-defined "Install Location" in C++ application
我有一个使用 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:\程序FilesChickens\libtest
- x64
- C:\Program Files (x86)Chickens\libtest
- 64 位版本
- x86
- 不会安装
- x64
- C:\程序FilesChickens\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。
我有一个使用 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:\程序FilesChickens\libtest
- x64
- C:\Program Files (x86)Chickens\libtest
- x86
- 64 位版本
- x86
- 不会安装
- x64
- C:\程序FilesChickens\libtest
- x86
当然,用户可以更改默认安装位置。
所以,我要做的是在我的 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。