Проблема с обменом с 1С через COMConnector из MS Visual C++
X

Привет дорогой друг

Наш сайт существует и развиваетется за счет рекламы. Пожалуйста, отключите блокировку рекламы AdBlock или подобное, для нашего сайта. Спасибо!
Показано с 1 по 2 из 2

Комбинированный просмотр

  1. #1
    Гость форума

    Регистрация
    03.03.2017
    Сообщений
    2
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию Проблема с обменом с 1С через COMConnector из MS Visual C++

    Всем привет.

    Пытаюсь из программы на 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;
        }

  2. #2
    Гость форума

    Регистрация
    03.03.2017
    Сообщений
    2
    Сказал(а) спасибо
    0
    Поблагодарили 0 раз(а) в 0 сообщениях

    По умолчанию Re: Проблема с обменом с 1С через COMConnector из MS Visual C++

    Тема закрыта. Надо было писать:

    VARIANT vRetMeta; vRetMeta.vt = 0;
    DISPPARAMS argsMeta = { NULL, NULL, 0, 0 };

Похожие темы

  1. Проблема на аппаратном уровне
    от Serbis в разделе Общие вопросы
    Ответов: 1
    Последнее сообщение: 10.11.2009, 12:18

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •