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 78 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 78 23.12.20 11:10 Сейчас в теме
(3)
Дело конечно Ваше) но почему именно СОМ - "древний как гавно мамонта"))) запустите простой api с тащите любые данные из 1С, а если так сильно хочется можете даже на с++ кодить в vcpkg REST SDK - отличная штука
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот