C++ V83.COMConnector Authenticate()
Платформа 1С v8.3
Windows
1С
Автоматизация
Языки программирования
Программист
Приложение (exe)
Вопрос
(Устарело) Разработка
Доброго времени суток!
Начал разрабатывать небольшое приложение на С++, которое должно подключаться к серверной базе через COMConnector, однако, запнулся на моменте с аутентификацией на кластере.
Согласно документации, метод Authenticate() требует три обязательных параметра (Authenticate(<Кластер>, <Имя>, <Пароль>)), первый из которых принимает тип "Кластер серверов".
Чтобы получить его, в VBS работает строка:
Используя подключение через IDispatch, я смог получить результат GetClusters(), который возвращает значение "Массив объектов "Кластер Серверов"" типа COMSafeArray, которое метод Invoke приводит к типу VARIANT (параметр retGetClusters):
Далее я пытаюсь подставить параметр <Кластер> в аргументы метода Authenticate() следующим кодом:
Я перепробовал, наверное, пару десятков разных способов. И элементы из SAFEARRAY и VARIANT-ы разных компоновок, тем не менее, каждый раз Authenticate() сообщает, что тип данных параметра 2 (то есть первого, в С++ аргументы заталкиваются в обратном порядке) не подходит. Перечитал массу мануалов, но ничего так и не придумал. В примерах люди коннектятся к файловым базам, и с этим никаких вопросов не возникает. Может быть, у кого-нибудь есть пример кода для прохождения аутентификации на кластере или какие-то соображения на этот счёт?
TL/DR: Как в С++ получить подходящее для Authenticate() значение для параметра <Кластер>?
Начал разрабатывать небольшое приложение на С++, которое должно подключаться к серверной базе через COMConnector, однако, запнулся на моменте с аутентификацией на кластере.
Согласно документации, метод Authenticate() требует три обязательных параметра (Authenticate(<Кластер>, <Имя>, <Пароль>)), первый из которых принимает тип "Кластер серверов".
Чтобы получить его, в VBS работает строка:
Set Cluster = AgentConnection.GetClusters().GetValue(0)
Используя подключение через IDispatch, я смог получить результат GetClusters(), который возвращает значение "Массив объектов "Кластер Серверов"" типа COMSafeArray, которое метод Invoke приводит к типу VARIANT (параметр retGetClusters):
hr = agentConnector->Invoke(dispIDGetClusters, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &argsGetClusters, &retGetClusters, NULL, NULL);
Далее я пытаюсь подставить параметр <Кластер> в аргументы метода Authenticate() следующим кодом:
UINT puArgErr;
VARIANT retAuth;
DISPPARAMS argsAuth = { NULL,NULL,0,0 };
argsAuth.rgvarg = new VARIANT[3];
argsAuth.cArgs = 3;
VariantInit(argsAuth.rgvarg);
argsAuth.rgvarg[0].vt = VT_BSTR;
argsAuth.rgvarg[0].bstrVal = SysAllocString(L"");
argsAuth.rgvarg[1].vt = VT_BSTR;
argsAuth.rgvarg[1].bstrVal = SysAllocString(L"");
argsAuth.rgvarg[2].vt = ???; // Какой тип данных должен быть
argsAuth.rgvarg[2]. ???; // и как получить необходимый объект?
hr = agentConnector->Invoke(dispIDAuthenticate, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &argsAuth, &retAuth, NULL, &puArgErr);
ПоказатьЯ перепробовал, наверное, пару десятков разных способов. И элементы из SAFEARRAY и VARIANT-ы разных компоновок, тем не менее, каждый раз Authenticate() сообщает, что тип данных параметра 2 (то есть первого, в С++ аргументы заталкиваются в обратном порядке) не подходит. Перечитал массу мануалов, но ничего так и не придумал. В примерах люди коннектятся к файловым базам, и с этим никаких вопросов не возникает. Может быть, у кого-нибудь есть пример кода для прохождения аутентификации на кластере или какие-то соображения на этот счёт?
TL/DR: Как в С++ получить подходящее для Authenticate() значение для параметра <Кластер>?
По теме из базы знаний
- Автообновление нескольких распределенных удаленных баз, личный опыт
- Создание мульти-базовых отчетов. Все, что вы хотели об этом знать
- Занимательный PowerShell
- Выгрузка в dt на сервере 1С по расписанию с завершением соединений и подключением к консоли сервера через com
- Мониторинг кластера 1С 8.3 в Zabbix
Ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(2)
У меня код практически идентичен тому, что по третьей ссылке, но
это коннект к файловой базе, как я и говорил.
Native API, вероятно, решит проблему, но кардинальным переписыванием кода, чего не хотелось бы делать.
Продолжаю поиски решения под OLE Automation.
У меня код практически идентичен тому, что по третьей ссылке, но
args.rgvarg[0].vt = VT_BSTR;
args.rgvarg[0].bstrVal = SysAllocString(OLESTR("File=\"C:\\base\";Usr=\"Администратор\""));
это коннект к файловой базе, как я и говорил.
Native API, вероятно, решит проблему, но кардинальным переписыванием кода, чего не хотелось бы делать.
Продолжаю поиски решения под OLE Automation.
(3)
[COM]
Object=V83.COMConnector
ConnectStr=Srvr="1cSrv"; Ref="1c83_base"; usr="Import"; pwd="5555"
[DB]
ConnectString=Provider=SQLOLEDB.1;Password=1C;Persist Security Info=True;User ID=Export1C;Initial Catalog=APT;Data Source=lcl_test
вот пример ini со строками подключения под с++ все прекрасно цепляется
Вы com регали на сервере? чтобы его использовать
https://winrcmd.wordpress.com/2019/04/02/sozdaniye-com-soedineniya-1c/
статья в тему ...
[COM]
Object=V83.COMConnector
ConnectStr=Srvr="1cSrv"; Ref="1c83_base"; usr="Import"; pwd="5555"
[DB]
ConnectString=Provider=SQLOLEDB.1;Password=1C;Persist Security Info=True;User ID=Export1C;Initial Catalog=APT;Data Source=lcl_test
вот пример ini со строками подключения под с++ все прекрасно цепляется
Вы com регали на сервере? чтобы его использовать
статья в тему ...
Вакансии
1С-Программист (интегратор Битрикс24)
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день
Санкт-Петербург
зарплата от 150 000 руб. до 250 000 руб.
Полный день