使用CMake读取注册表值

时间:2018-11-29 09:34:38

标签: oracle cmake registry

我在Internet上做了很多研究,但无法解决自己的问题。

对于Windows构建环境,我们需要Oracle客户端。没有环境变量包含ORACLE_HOME的路径。但是在注册表中有此路径,如here所述。

据我发现,CMake也可以读取注册表。这已经在Stackoverflow上被问过了。但是在我的环境中,这是行不通的,而且我的想法也用光了。

首先,我尝试了 set 命令。但这不再起作用。

set(ora_set "[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]")
message( "ora_set (set) = ${ora_set}" )

输出:

ora_set (set) = [HKLM\SOFTWARE\ORACLE\KEY_OraClient12Home1\ORACLE_HOME]

我本来希望得到<Path to ORACLE_HOME>,但是我已经有了<[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]>

然后我尝试了 get_filename_component ,如StackOverflow上的here所述:

get_filename_component(ora_gfc "[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]" ABSOLUTE CACHE)
message( "ora_gfc (get_filename_component) = ${ora_gfc}" )

输出:

ora_gfc (get_filename_component) = <Path to ORACLE_HOME>[HKLM/SOFTWARE/ORACLE/KEY_OraClient12Home1/ORACLE_HOME]

我期望得到<Path to ORACLE_HOME>,但我已经得到<Path to ORACLE_HOME[HKLM\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1\\ORACLE_HOME]>。 CMake总是将注册表路径附加到注册表中的值。我找不到防止这种情况的方法。

我尝试了 execute_process 作为第三种可能性,因为使用reg查询,您还可以按照here的说明从批处理中读取注册表。

execute_process (
    COMMAND FOR /F "usebackq tokens=3*" %%A IN (`REG QUERY "HKEY_LOCAL_MACHINE\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1" /v ORACLE_HOME`) DO ECHO %%A
    OUTPUT_VARIABLE ora_exp
)
message( "ora_exp (execute_process) = ${ora_exp}" )

输出:

ora_exp (execute_process) =

我期望得到<Path to ORACLE_HOME>,但是我有一个空变量。尽管批处理命令在单独的批处理文件中按预期工作,但CMake似乎也不喜欢。

现在我迷路了:如何使用CMake正确读取注册表值。有人提示吗?

我的环境是

  • Windows 10 64位
  • CMake 3.12.4
  • Oracle客户端12.2.0.1

1 个答案:

答案 0 :(得分:0)

似乎发生了两件事。您不能使用set来读取注册表。 https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-get-a-windows-registry-key-

GET_FILENAME_COMPONENT(test_set "[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\14.0\\VC\\Runtimes\\debug\\x64;Version]" ABSOLUTE CACHE) message( "test_set (set) = ${test_set}" )

张照片: test_set (set) = C:/Users/XXX/v14.14.26405.00

还请注意密钥的格式。可能应该是: [HKEY_LOCAL_MACHINE\\SOFTWARE\\ORACLE\\KEY_OraClient12Home1;ORACLE_HOME]

它也仅适用于某些类型的注册表项类型,否则将仅返回/registry