Всем привет.

Пытаюсь из программы на MS Visual C++ подключится к базе 1С через COMConnector и получить версию конфигурации.

Ниже приведен код. Почему то после удачного соединения в базой,
не получается получить IDispatch на "Метаданные", чтобы потом получить свойство "Версия". Вызываю Invoke для dispID "Метаданные" с флагом DISPATCH_PROPERTYGET. Invoke возвращает ошибку 0x80020008 которая означает "Один из аргументов метода не является допустимым типом variant". В чем может быть проблема? Где я ошибся?


Код:
// ProgramTest.cpp : Defines the entry point for the console application.
    //
     
    #include "stdafx.h"
    #include <objbase.h>
    #include <comdef.h>
    #include <iostream>
     
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        int i;
        HRESULT hr = CoInitialize(NULL);
        if(FAILED(hr))
        {      
            return 0;
        }
     
        CLSID   cls80;
     
        hr = CLSIDFromProgID(L"V82.COMConnector", &cls80);
        if(FAILED(hr))
        {
            CoUninitialize();
            return 0;
        }
     
        IDispatch *pv80;
     
        hr = CoCreateInstance(cls80, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pv80);
     
        if(FAILED(hr)||!pv80)
        {
            CoUninitialize();
            return 0;
        }
     
        VARIANT vRet;
        DISPPARAMS args = {0, 0, 0, 0};
        VARIANT vars[3];  
     
        args.cArgs = 1;
        args.rgvarg = vars;
        ZeroMemory(vars, sizeof(vars));
     
        std::locale::global(std::locale(""));  
        vars[0].vt = VT_BSTR;
        vars[0].bstrVal = OLESTR("File="D:\\Разработка\\По работе\\Конвертация";");
     
        DISPID dispID;
        BSTR MethodName=L"Connect";
        hr = pv80->GetIDsOfNames(IID_NULL, &MethodName, 1, 0, &dispID);    
     
        if (FAILED(hr))
        {      
            if (pv80) pv80->Release();
            CoUninitialize();
            return 0;
        }
     
        EXCEPINFO exs;
     
     
        //соединимся с информационной базой
        hr = pv80->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD,&args, &vRet, &exs, NULL);
     
        if (FAILED(hr))
        {      
            if (pv80) pv80->Release();
            CoUninitialize();
            return 0;
        }
     
        if(vRet.vt!=VT_DISPATCH)
        {
            if (pv80) pv80->Release();
            CoUninitialize();
            return 0;
        }
     
        /////ВСЕ ОК, СОЕДИНИЛИСЬ/////
        std::cout<<"Соединилсь с базой успешно"<<std::endl;
        IDispatch *connector=vRet.pdispVal;    
     
        //хотим получить версию конфигурации
        //в 1С  это далется так: Метаданные.Версия
        //если попробовать из однй базы 1С подключится через COMConnector к другой базе 1С вот таким кодом:
        ////V8 = Новый COMObject ("V82.COMConnector");
        ////
        ////Соединение = V8.Connect ("File=""D:\Разработка\По работе\Конвертация"";");
        ////Сообщить(Соединение.Метаданные.Версия);
        //то все получается.
        //теперь попробуем здесь сделать также
     
     
        VARIANT vRetMeta;
        DISPPARAMS argsMeta = {0, 0, 0, 0}; //параметров никаких нет, это же получение свойства
     
        MethodName=L"Метаданные";
        hr = connector->GetIDsOfNames(IID_NULL,&MethodName, 1, 0, &dispID);    
     
        if (FAILED(hr))
        {      
            if (connector) connector->Release();
            if (pv80) pv80->Release();
            CoUninitialize();
            return 0;
        }
     
        //получить IDispatch на метаданные
        hr = connector->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET,&argsMeta, &vRetMeta, &exs, NULL);
     
        if (FAILED(hr))
        {      
            //попадаем сюда, с ошибкой
            if (hr==DISP_E_BADVARTYPE)
            {
                std::cout<<"Что-то не так с DISPPARAMS"<<std::endl;
            }
            else {
                char ch[20];
                itoa(hr,ch,16);
                std::cout<<"Ошибка с кодом"<<ch<<std::endl;
            }
     
            std::cin>>i;
     
            if (connector) connector->Release();
            if (pv80) pv80->Release();
            CoUninitialize();
            return 0;
        }
     
        if(vRetMeta.vt!=VT_DISPATCH)
        {
            if (connector) connector->Release();
            if (pv80) pv80->Release();
            CoUninitialize();
            return 0;
        }
     
     
        std::cout<<"отлично, есть IDispatch на метаданные, можно дальше получать версию"<<std::endl;
        std::cin>>i;
     
        return 0;
    }