PDA

Просмотр полной версии : Проблема с обменом с 1С через COMConnector из MS Visual C++



ProxyDixis
03.03.2017, 10:26
Всем привет.

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

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

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