访问注册表数据以设置链接器和包含路径

Access the registry data to set the linker and include paths

本文关键字:包含 路径 链接 设置 注册表 数据 访问      更新时间:2023-10-16

我正在VS2102中编写一个C++程序,使用一些给定的库和其他软件的头文件,这些软件将这些文件作为API提供(位于"软件安装文件夹"+\include\lib\x86或\include\lib \x64中)。

现在,我想确保即使安装路径不同,我的程序也能工作,所以我需要从注册表中提取安装路径,并动态更改包含路径链接器设置。这可能吗?

编辑我正在将程序编译到dll中,以便稍后在C#项目中使用。是否可以将安装路径(以及链接器和包含项目设置)设置为全局变量,将程序编译为dll(使用现有的有效设置),然后在通过dllimport首次加载dll之前由外部程序重置此变量?

MSBuild提供了一种语法,用于从VS2012的此处链接和此处直接链接的注册表中读取值(并初始化生成属性)。

您可以使用以下语法读取系统注册表值,其中Hive是注册表配置单元(例如HKEY_LOCAL_MACHINE),Key为注册表项名称,SubKeyalue为子注册表项的值。

$(registry:HiveMyKeyMySubKey@Value)

要获得默认的子键值,请省略

$(registry:HiveMyKeyMySubKey)

此注册表值可用于初始化生成属性。例如,要创建表示Visual Studio web浏览器主页的构建属性,请使用以下代码:

<PropertyGroup>
<VisualStudioWebBrowserHomePage>
$(registry:HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio11.0WebBrowser@HomePage)
</VisualStudioWebBrowserHomePage>
<PropertyGroup>

读取后,您可以在项目的附加include和库路径中使用build属性。

例如,它可能看起来像;

<PropertyGroup>
<ThirdPartySoftware_1>
$(registry:HKEY_CURRENT_USERSoftwareThirdPartySW_1@InstalledLocation
</ThirdPartySoftware_1>
</PropertyGroup>

并添加到项目文件中,或通过.props文件包含。

根据您的编辑构建需求与运行时需求不同。通过确保路径中有正确的文件夹,可以解决运行时加载问题;或者更可能的情况是,为目标平台分发正确的dll。


作为替代方案,您也可以将其作为环境设置任务(或与第三方软件相关的安装后任务)。

位于软件安装文件夹+includelibx86includelibx64

将第三方软件的安装路径设置为";软件安装文件夹";根据需要。例如(在系统环境变量中);

ThirdPartySoftware_1 = "software installation folder";

一旦完成,就可以在IDE中使用它来添加到include路径中;

$(ThirdPartySoftware_1)include

和图书馆路径;

$(ThirdPartySoftware_1)includelib$(Platform)

以上假设$(Platform)变量是x86x64。有时向导会为x86生成一个Win32平台。