Показано с 1 по 2 из 2
-
03.03.2017, 11:26 #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; }
-
03.03.2017, 11:46 #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 };
Похожие темы
-
Проблема на аппаратном уровне
от Serbis в разделе Общие вопросыОтветов: 1Последнее сообщение: 10.11.2009, 12:18
Социальные закладки