Чтение значений реестра с использованием CMake - PullRequest
0 голосов
/ 29 ноября 2018

Я провел много исследований в Интернете, но не смог решить свою проблему.

Для нашей среды сборки Windows нам нужен клиент Oracle.Нет переменной среды, содержащей путь к ORACLE_HOME.Но в реестре есть этот путь, как описано здесь .

Насколько я выяснил, 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:

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 вы также можете прочитать реестр из пакета, как описано здесь .

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 Client 12.2.0.1

1 Ответ

0 голосов
/ 29 ноября 2018

Кажется, что происходит две вещи.Вы не можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...