Очень нужен метод для чтения значения из реестра ОС

tormozit Закрыто Средний

Для решения проблемы регистрации COM классов при работе ИР адаптера из 32-разрядного конфигуратора https://turboconf.ru/Tasks/9036 требуется читать значение из реестра ОС. Но из-за ошибки ОСкрипт 1.7 https://github.com/EvilBeaver/OneScript/issues/1324 я не могу это сделать надежно.
Поэтому прошу добавить аналогичный метод в API https://learn.microsoft.com/en-us/previous-versions/windows/desktop/regprov/getstringvalue-method-in-class-stdregprov

Комментарии

bolsun
#1, 05 января 2024 22:22

OneScript не умеет получить ключ реестра? Я же не могу весь WinAPI реализовать в API.
bolsun изменил статус на Открыто


tormozit
#2, 05 января 2024 22:24

(1) bolsun, сначала я узнал в чате ОСкрипта. Там не смогли помочь.


bolsun
#3, 06 января 2024 17:53

https://disk.yandex.ru/d/XKCz9ijzgtoO1w

Сообщить(ТурбоКонф.ПолучитьЗначениеИзРеестра("HKEY_CURRENT_USER\SOFTWARE\TurboConf", "LicenseKey", "ЗначениеПоУмолчаниюЕслиНеНайдено"));


tormozit
#4, 06 января 2024 19:46

Проверил. Работает.
tormozit изменил статус на Закрыто


tormozit
#5, ред. 07 января 2024 17:19

В случае отсутствия нужного ключа в реестре возникает ошибка.
Тест:

ВеткаРеестра = "SOFTWARE\Classes\CLSID\{e92b75e3-2ea1-4fec-b493-cef3ec596666}\LocalServer32";
ИмяФайлаКласса = ТурбоКонф.ПолучитьЗначениеИзРеестра("HKEY_LOCAL_MACHINE\" + ВеткаРеестра, "", "");

Ошибка:

ScriptEngine.Machine.ExternalSystemException: {Модуль C:\Portable\TurboConf\user_scripts\RDT.os / Ошибка в строке: 2346 / Внешнее исключение (System.NullReferenceException): Ссылка на объект не указывает на экземпляр объекта.}
ИмяФайлаКласса = ТурбоКонф.ПолучитьЗначениеИзРеестра("HKEY_LOCAL_MACHINE" + ВеткаРеестра, "", "");
---> System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта.
в TurboConf.HostApplication.Api.GetValueFromRegistry(String keyName, String valueName, String defaultValue)
в lambda_method(Closure , Api , IValue[] )
в ScriptEngine.Machine.Contexts.AutoContext`1.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
в ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(Int32 arg)
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
--- Конец трассировки внутреннего стека исключений ---
в ScriptEngine.Machine.MachineInstance.MainCommandLoop()
в ScriptEngine.Machine.MachineInstance.ExecuteCode()
в ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, Int32 methodIndex, IValue[] arguments)
в ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(Int32 methodNumber, IValue[] arguments, IValue& retValue)
в TurboConf.HostApplication.HostApplicationForm.ExecuteScript(Script script, Keys ctrl, Keys alt, Keys shift, ScreenForm statusForm, String entryPoint, ScriptOptions options, IVariable[] parameters)

tormozit изменил статус на Открыто


bolsun
#6, 13 января 2024 20:15

(5) tormozit, какой результат предполагается, если ветки нет?
Значение по умолчанию? Оно теоретически предназначалось если нет значения ветки, а не самой ветки.
Могу конечно и в этом случае возвращать значение по умолчанию.


tormozit
#7, ред. 13 января 2024 21:17

Мне кажется, существование ветки в подавляющем большинстве случаев не интересно. Задача функции - прочитать значение по заданном адресу, который определяется веткой и именем ключа в ней. Если такого ключа не существует, то возвращай значение по умолчанию, независимо от существования ветки.
Ну или хотя бы сделай человеческий выброс исключения типа "Ветка не найдена".


bolsun
#8, ред. 13 января 2024 21:39

В текущей версии при отсутствии ветки в реестре возвращается значение по умолчанию.


bolsun
#9, 16 января 2024 20:24

bolsun изменил статус на Закрыто


Для вставки изображения или файла, перетащите его в поле редактора или вставьте файл из буфера