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

Пытаюсь из программы на 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
Проблема с обменом с 1С через COMConnector из MS Visual C++
    #39413555
ProxyDixis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тема закрыта, надо было писать:

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


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