C++ V83.COMConnector Authenticate()

1. PRAGMA_ONCE 21.12.20 19:15 Сейчас в теме
Доброго времени суток!

Начал разрабатывать небольшое приложение на С++, которое должно подключаться к серверной базе через 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() значение для параметра <Кластер>?
Ответы
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
3. PRAGMA_ONCE 21.12.20 21:27 Сейчас в теме
(2)
У меня код практически идентичен тому, что по третьей ссылке, но
       args.rgvarg[0].vt = VT_BSTR;
       args.rgvarg[0].bstrVal = SysAllocString(OLESTR("File=\"C:\\base\";Usr=\"Администратор\"")); 

это коннект к файловой базе, как я и говорил.

Native API, вероятно, решит проблему, но кардинальным переписыванием кода, чего не хотелось бы делать.
Продолжаю поиски решения под OLE Automation.
4. ivan1703 37 23.12.20 11:07 Сейчас в теме
(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/
статья в тему ...
5. ivan1703 37 23.12.20 11:10 Сейчас в теме
(3)
Дело конечно Ваше) но почему именно СОМ - "древний как гавно мамонта"))) запустите простой api с тащите любые данные из 1С, а если так сильно хочется можете даже на с++ кодить в vcpkg REST SDK - отличная штука
Оставьте свое сообщение
Вакансии
Консультант-программист по информационным системам 1С
Москва
зарплата от 150 000 руб. до 200 000 руб.
Полный день

Системный архитектор 1С
Москва
зарплата от 250 000 руб.
Полный день

Руководитель группы 1С
Екатеринбург
зарплата от 200 000 руб.
Полный день

Программист 1С
Уфа
зарплата от 110 000 руб.
Полный день

Функциональный архитектор
Москва
зарплата от 200 000 руб. до 300 000 руб.
Полный день