Гость
Форумы / [игнор отключен] [закрыт для гостей] / Проблема с обменом с 1С через COMConnector из MS Visual C++ / 2 сообщений из 2, страница 1 из 1
03.03.2017, 10:15
    #39413521
ProxyDixis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обменом с 1С через COMConnector из MS Visual C++
Всем привет.

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
    // 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;
    }
...
Рейтинг: 0 / 0
03.03.2017, 10:47
    #39413555
ProxyDixis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с обменом с 1С через COMConnector из MS Visual C++
Тема закрыта, надо было писать:

Код: plaintext
1.
2.
VARIANT    vRetMeta; vRetMeta.vt = 0;
DISPPARAMS argsMeta = { NULL, NULL, 0, 0 };
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / Проблема с обменом с 1С через COMConnector из MS Visual C++ / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]