Начал разрабатывать небольшое приложение на С++, которое должно подключаться к серверной базе через COMConnector, однако, запнулся на моменте с аутентификацией на кластере.
Согласно документации, метод Authenticate() требует три обязательных параметра (Authenticate(<Кластер>, <Имя>, <Пароль>)), первый из которых принимает тип "Кластер серверов".
Чтобы получить его, в VBS работает строка:
Set Cluster = AgentConnection.GetClusters().GetValue(0)
Используя подключение через IDispatch, я смог получить результат GetClusters(), который возвращает значение "Массив объектов "Кластер Серверов"" типа COMSafeArray, которое метод Invoke приводит к типу VARIANT (параметр retGetClusters):
Далее я пытаюсь подставить параметр <Кластер> в аргументы метода 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)
Дело конечно Ваше) но почему именно СОМ - "древний как гавно мамонта"))) запустите простой api с тащите любые данные из 1С, а если так сильно хочется можете даже на с++ кодить в vcpkg REST SDK - отличная штука