Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SAN  
Дата: 12.02.15 11:43
Оценка:
Прошу помочь дописать программу VC++ 2010 MFC:

соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?

void CMy1С_V83_COMConnectorDlg::OnBnClickedButton1()
{
    //для начала инициализируем COM
    HRESULT hr = CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    if(FAILED(hr))
    {
      AfxMessageBox(_T("Невозможно инициализировать COM!"));
      return;
    }
    CLSID cls8;
    hr = CLSIDFromProgID(L"V83.COMConnector",&cls8);
    if(FAILED(hr))
    {
      AfxMessageBox(_T("Переустановите 1С Предприятие!"));
      CoUninitialize();
      return;
    }
    IDispatch *pv8 = NULL;
    hr = CoCreateInstance(cls8,NULL,CLSCTX_INPROC_SERVER,IID_IDispatch,(void**)&pv8);
    if(FAILED(hr)  ||  !pv8)
    {
      AfxMessageBox(_T("Невозможно инициализировать 1С Предприятия")); 
      CoUninitialize();
      return;
    }       
       DISPID dispIDInitialize;
       OLECHAR * init = L"Connect";
       hr = pv8->GetIDsOfNames(IID_NULL,&init,1,LOCALE_SYSTEM_DEFAULT,&dispIDInitialize);
        if (FAILED(hr))
        {
            AfxMessageBox(_T("Не удалось получить ID от Initialize"));
            if (pv8) pv8->Release();
            CoUninitialize();
            return;
        }
        // Connect принимает только 1 параметр
        VARIANT VarResult;//указатель на интерфейс IDispatch
        VarResult.vt=VT_EMPTY;
       DISPPARAMS args = {NULL,NULL,0,0};
       args.rgvarg = new VARIANT[1];
       args.cArgs = 1;

       VariantInit(args.rgvarg);
       args.rgvarg[0].vt = VT_BSTR;
       args.rgvarg[0].bstrVal = SysAllocString(L"File=\"C:\\base\";Usr=\"Администратор\""); 
       hr = pv8->Invoke(dispIDInitialize,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&args,&VarResult,NULL,NULL);
              if (FAILED(hr))
        {
            AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
            if (pv8) pv8->Release();
            CoUninitialize();
            return;
        }        
        VarResult.vt=VT_EMPTY;
        pv8->Release();
       CoUninitialize();
       SysFreeString(args.rgvarg[0].bstrVal);
       delete [] args.rgvarg;
}
Отредактировано 12.02.2015 11:46 SANblCH_SUN . Предыдущая версия .
Re: Работа из VC++ с базой 1С83 через V83.COMConnector
От: Sni4ok  
Дата: 12.02.15 22:20
Оценка:
Здравствуйте, SANblCH_SAN, Вы писали:

SAN>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?


насчёт вопроса хз, но вот тут

SAN>
SAN>        {
SAN>            AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
SAN>            if (pv8) pv8->Release();
SAN>            CoUninitialize();
SAN>            return;
SAN>        }        
SAN>


вы не освобождаете args.rgvarg
Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 13.02.15 09:28
Оценка:
Здравствуйте, Sni4ok, Вы писали:

S>Здравствуйте, SANblCH_SAN, Вы писали:


SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?


S>насчёт вопроса хз, но вот тут


SAN>>
SAN>>        {
SAN>>            AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
SAN>>            if (pv8) pv8->Release();
SAN>>            CoUninitialize();
SAN>>            return;
SAN>>        }        
SAN>>


S>вы не освобождаете args.rgvarg




Спасибо за поправку, согласен.
Re: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 13.02.15 10:23
Оценка:
Здравствуйте, SANblCH_SAN, Вы писали:

SAN>Прошу помочь дописать программу VC++ 2010 MFC:


SAN>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?


Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.

По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 13.02.15 11:23
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SAN, Вы писали:


SAN>>Прошу помочь дописать программу VC++ 2010 MFC:


SAN>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?


_>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.


_>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?



так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.

есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:

void CExcelTestDlg::OnBnClickedTest2()
{

    HRESULT hr;
    VARIANT varRet;
 
        CLSID cls8;



        hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
    if( FAILED(hr) ) // проверка на присутствие 1С Automation Sever-а
    {
        AfxMessageBox(_T("Переустановите 1С Предприятие!"));
        return;
    }

    CString m_strPath = _T("C:\\base");
    CString m_Usr = _T("Администратор");
    CString m_Pwd = _T("");

    varRet = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");

    if( (varRet.vt != VT_BOOL)||(varRet.boolVal == 0) ) // проверка удачно/не удачно
    {
        AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
        v8COMBase.Release();
        return;
    }
    CDispatchHelper v8SpravPol; // наш справочник
 
    v8SpravPol = v8COMBase.Invoke(L"NewObject", L"СправочникМенеджер.Пользователи");
    if( !v8SpravPol )
    {
        AfxMessageBox(_T("Невозможно подключиться к [Справочник.Пользователи]"));
        v8COMBase.Release();
        return;
    }

    CDispatchHelper v8Admin; // наш Админ :)
 
    v8Admin = v8SpravPol.Invoke(L"НайтиПоНаименованию", L"Администратор", false, (IDispatch*)NULL, (IDispatch*)NULL);
    if( !v8Admin )
    {
        AfxMessageBox(_T("Пользователь Администратор не найден"));
        v8SpravPol.Release();
        v8COMBase.Release();
        return;
    }
    VARIANT varRet1; // переменная для хранения результата
 
    varRet1 = v8Admin.Get(L"Наименование"); // получаем значение поля
    AfxMessageBox(_T(CString(varRet1.bstrVal))); // выводим сообщение о прочитанном имени пользователя

    v8Admin.Release(); // Админ
    v8SpravPol.Release(); // справочник
}


класс CDispatchHelper, находится тут:
http://files.rsdn.ru/120582/DispatchHelper.cpp
http://files.rsdn.ru/120582/DispatchHelper.h


Так вот, меняю я строку:
hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С


На строку:

hr = v8COMBase.CreateInstance(L"V83.COMConnector"); // создаем COM соединение с 1С


в классе CDispatchHelper, т.е :

http://files.rsdn.ru/120582/DispatchHelper.h

меняю строку

HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_LOCAL_SERVER);



на строку:

HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_INPROC_SERVER);



После этого ошибка:
Невозможно подключиться к базе 1С Предприятия
Отредактировано 13.02.2015 11:32 SANblCH_SUN . Предыдущая версия . Еще …
Отредактировано 13.02.2015 11:30 SANblCH_SUN . Предыдущая версия .
Re[3]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 13.02.15 11:54
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.


SAN>После этого ошибка:

SAN>Невозможно подключиться к базе 1С Предприятия

а что за ошибка? что говорит GetErrorInfo?
Re[4]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 13.02.15 11:59
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.


SAN>>После этого ошибка:

SAN>>Невозможно подключиться к базе 1С Предприятия

_>а что за ошибка? что говорит GetErrorInfo?



как воспользоваться командой GetErrorInfo, или как вывести ошибку?
Re[5]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 13.02.15 12:04
Оценка: 3 (1)
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Здравствуйте, saf_e, Вы писали:


_>>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.


SAN>>>После этого ошибка:

SAN>>>Невозможно подключиться к базе 1С Предприятия

_>>а что за ошибка? что говорит GetErrorInfo?



SAN>как воспользоваться командой GetErrorInfo, или как вывести ошибку?


https://msdn.microsoft.com/en-us/library/windows/desktop/ms221032(v=vs.85).aspx
Re[6]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 13.02.15 12:08
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>Здравствуйте, saf_e, Вы писали:


_>>>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.


SAN>>>>После этого ошибка:

SAN>>>>Невозможно подключиться к базе 1С Предприятия

_>>>а что за ошибка? что говорит GetErrorInfo?



SAN>>как воспользоваться командой GetErrorInfo, или как вывести ошибку?


_>https://msdn.microsoft.com/en-us/library/windows/desktop/ms221032(v=vs.85).aspx



попробую спасибо
Re[6]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 18.02.15 13:32
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>Здравствуйте, saf_e, Вы писали:


_>>>Здравствуйте, SANblCH_SUN, Вы писали:


SAN>>>>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.


SAN>>>>После этого ошибка:

SAN>>>>Невозможно подключиться к базе 1С Предприятия

_>>>а что за ошибка? что говорит GetErrorInfo?



SAN>>как воспользоваться командой GetErrorInfo, или как вывести ошибку?


_>https://msdn.microsoft.com/en-us/library/windows/desktop/ms221032(v=vs.85).aspx



Извините, я не вдупляю — как воспользоваться командой GetErrorInfo, можете помочь?
Re[7]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 18.02.15 13:51
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

_>>https://msdn.microsoft.com/en-us/library/windows/desktop/ms221032(v=vs.85).aspx


SAN>Извините, я не вдупляю — как воспользоваться командой GetErrorInfo, можете помочь?


Примерно так:

IErrorInfo *p_err;
if(SUCCEEDED(GetErrorInfo(0, &p_err)))
{
    BSTR err_text;
    if(SUCCEEDED(p_err->GetDescription(&text)))
    {
    // изучаем ошибку
    }
}


Код написан на коленке, для отладки должно хватить.
Re[8]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 18.02.15 14:01
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SUN, Вы писали:


_>>>https://msdn.microsoft.com/en-us/library/windows/desktop/ms221032(v=vs.85).aspx


SAN>>Извините, я не вдупляю — как воспользоваться командой GetErrorInfo, можете помочь?


_>Примерно так:


_>
_>IErrorInfo *p_err;
_>if(SUCCEEDED(GetErrorInfo(0, &p_err)))
_>{
_>    BSTR err_text;
_>    if(SUCCEEDED(p_err->GetDescription(&text)))
_>    {
_>    // изучаем ошибку
_>    }
_>}
_>


_>Код написан на коленке, для отладки должно хватить.



Наверное имелось ввиду:
if(SUCCEEDED(p_err->GetDescription(&err_text))) ?
Re[9]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 18.02.15 14:04
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Наверное имелось ввиду:
SAN>if(SUCCEEDED(p_err->GetDescription(&err_text))) ?

да
Re[8]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 18.02.15 14:36
Оценка:
Здравствуйте, saf_e, Вы писали:

_>Здравствуйте, SANblCH_SUN, Вы писали:


_>>>https://msdn.microsoft.com/en-us/library/windows/desktop/ms221032(v=vs.85).aspx


SAN>>Извините, я не вдупляю — как воспользоваться командой GetErrorInfo, можете помочь?


_>Примерно так:


_>
_>IErrorInfo *p_err;
_>if(SUCCEEDED(GetErrorInfo(0, &p_err)))
_>{
_>    BSTR err_text;
_>    if(SUCCEEDED(p_err->GetDescription(&text)))
_>    {
_>    // изучаем ошибку
_>    }
_>}
_>


_>Код написан на коленке, для отладки должно хватить.



При выполнении строки:

p_err->GetDescription(&err_text)


получаю ошибку:

Необработанное исключение в "0x77dc15de" в Run.exe:0xC0000005:
Нарушение прав доступа при чтении "0x00000000".
Re: Работа из VC++ с базой 1С83 через V83.COMConnector
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 18.02.15 14:36
Оценка:
Здравствуйте, SANblCH_SAN, Вы писали:

Что бы не заниматься мазохизмом лучше основную часть вынести во внешнюю обработку
http://www.forum.mista.ru/topic.php?id=698585
Которую легко отлаживать в среде 1С, а из C++ сделать всего несколько операторов. Это касается не только С++ при вызове через СОМ.
и солнце б утром не вставало, когда бы не было меня
Re[9]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 18.02.15 14:41
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Здравствуйте, saf_e, Вы писали:


SAN>Необработанное исключение в "0x77dc15de" в Run.exe:0xC0000005:

SAN>Нарушение прав доступа при чтении "0x00000000".

вот код стандартного _com_error:

inline _bstr_t _com_error::Description() const
{
BSTR bstr = NULL;
if (m_perrinfo != NULL) {
if (FAILED(m_perrinfo->GetDescription(&bstr))) {
bstr = NULL;
}
}
return _bstr_t(bstr, false);
}

Попробуйте его
Re[2]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 18.02.15 15:18
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, SANblCH_SAN, Вы писали:


S>Что бы не заниматься мазохизмом лучше основную часть вынести во внешнюю обработку

S>http://www.forum.mista.ru/topic.php?id=698585
S> Которую легко отлаживать в среде 1С, а из C++ сделать всего несколько операторов. Это касается не только С++ при вызове через СОМ.


Как приведенный код С# реализовать в VC++ 2010 MFC?
Я как раз и стремлюсь выполнить соединение с 1с базой и вызвать в ней внешнюю обработку, но все это сделать из VC++.
Причем хочу использовать соединение через V83.COMConnector, что получилось, но только соединится с базой а вот вызвать внешнюю обработку или глобальную функцию из 1с базы не получается.

Напротив через V83.Application смог получить имя пользователя 1с базы, но этот вариант не подходит.
Re[3]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.02.15 08:30
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Здравствуйте, Serginio1, Вы писали:


S>>Здравствуйте, SANblCH_SAN, Вы писали:


S>>Что бы не заниматься мазохизмом лучше основную часть вынести во внешнюю обработку

S>>http://www.forum.mista.ru/topic.php?id=698585
S>> Которую легко отлаживать в среде 1С, а из C++ сделать всего несколько операторов. Это касается не только С++ при вызове через СОМ.


SAN>Как приведенный код С# реализовать в VC++ 2010 MFC?

SAN>Я как раз и стремлюсь выполнить соединение с 1с базой и вызвать в ней внешнюю обработку, но все это сделать из VC++.
SAN>Причем хочу использовать соединение через V83.COMConnector, что получилось, но только соединится с базой а вот вызвать внешнюю обработку или глобальную функцию из 1с базы не получается.

SAN>Напротив через V83.Application смог получить имя пользователя 1с базы, но этот вариант не подходит.

Ну до динамиков в C# тоже приходилось писать через Reflection. На С++ полно враперов для упрощения работы с IDispatch. Кстати можешь и описать диспинтерфейсы. Например http://files.rsdn.ru/19608/C1InDelphi.zip правда там на Delphi.
и солнце б утром не вставало, когда бы не было меня
Re[10]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: SANblCH_SUN  
Дата: 19.02.15 12:49
Оценка:
Продолжаю тему!
Я привел два варианта кода через V83.COMConnector и V83.Application к одному виду:

void CMy1C_V83_ApplicationDlg::OnBnClickedButton1()
{
    HRESULT hr = CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    if(FAILED(hr))
    {
      AfxMessageBox(_T("Невозможно инициализировать COM!"));
      return;
    }
    CLSID cls8;
    hr = CLSIDFromProgID(L"V83.Application", &cls8);
    if(FAILED(hr))
    {
      AfxMessageBox(_T("Переустановите 1С Предприятие!"));
      CoUninitialize();
      return;
    }
    IDispatch *pv8 = NULL;
    hr = CoCreateInstance(cls8,NULL,CLSCTX_LOCAL_SERVER,IID_IDispatch,(void**)&pv8);
    if(FAILED(hr)  ||  !pv8)
    {
      AfxMessageBox(_T("Невозможно инициализировать 1С Предприятия")); 
      if (pv8) pv8->Release();
      CoUninitialize();
      return;
    }
    DISPID dispIDInitialize;
    OLECHAR * init = L"Connect";
    hr = pv8->GetIDsOfNames(IID_NULL,&init,1,LOCALE_SYSTEM_DEFAULT,&dispIDInitialize);
    if (FAILED(hr))
    {
        AfxMessageBox(_T("Не удалось получить ID от Connect"));
        if (pv8) pv8->Release();
        CoUninitialize();
        return;
    }
    // Connect принимает только 1 параметр
    DISPPARAMS args = {NULL,NULL,0,0};
    args.rgvarg = new VARIANT[1];
    args.cArgs = 1;
    VariantInit(args.rgvarg);
    args.rgvarg[0].vt = VT_BSTR;
    args.rgvarg[0].bstrVal = SysAllocString(L"File=\"C:\\base\";Usr=\"Администратор\""); 
    hr = pv8->Invoke(dispIDInitialize,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&args,NULL,NULL,NULL);
    if (FAILED(hr))
    {
        AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
        if (pv8) pv8->Release();
        delete [] args.rgvarg;
        CoUninitialize();
        return;
    }
//------------------------------------------------------------------------------------------------
    DISPID dispidFunc;
    LPOLESTR sFunc = L"ExternalDataProcessors";
    hr = pv8->GetIDsOfNames(IID_NULL, &sFunc, 1, 0, &dispidFunc); 
    if (FAILED(hr))
    {
        AfxMessageBox(_com_error(GetLastError()).ErrorMessage(),MB_ICONSTOP);
        AfxMessageBox(_com_error(hr).ErrorMessage(),MB_ICONSTOP);
        AfxMessageBox(_T("Невозможно получить ExternalDataProcessors"));
        if (pv8) pv8->Release();
        CoUninitialize();
        return;
    }
    //----------------------------------------------------------------------------------
     pv8->Release();
    CoUninitialize();
    SysFreeString(args.rgvarg[0].bstrVal);    
    delete [] args.rgvarg;
}


void CMy1С_V83_COMConnectorDlg::OnBnClickedButton1()
{
    //для начала инициализируем COM
    HRESULT hr = CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
    if(FAILED(hr))
    {
      AfxMessageBox(_T("Невозможно инициализировать COM!"));
      return;
    }
    CLSID cls8;
    hr = CLSIDFromProgID(L"V83.COMConnector",&cls8);
    if(FAILED(hr))
    {
      AfxMessageBox(_T("Переустановите 1С Предприятие!"));
      CoUninitialize();
      return;
    }
    IDispatch *pv8 = NULL;
    hr = CoCreateInstance(cls8,NULL,CLSCTX_INPROC_SERVER,IID_IDispatch,(void**)&pv8);
    if(FAILED(hr)  ||  !pv8)
    {
      AfxMessageBox(_T("Невозможно инициализировать 1С Предприятия")); 
      if (pv8) pv8->Release();
      CoUninitialize();
      return;
    }
       DISPID dispIDInitialize;
       OLECHAR * init = L"Connect";
       hr = pv8->GetIDsOfNames(IID_NULL,&init,1,LOCALE_SYSTEM_DEFAULT,&dispIDInitialize);
        if (FAILED(hr))
        {
            AfxMessageBox(_T("Не удалось получить ID от Connect"));
            if (pv8) pv8->Release();
            CoUninitialize();
            return;
        }
        // Connect принимает только 1 параметр
       DISPPARAMS args = {NULL,NULL,0,0};
       args.rgvarg = new VARIANT[1];
       args.cArgs = 1;
       VariantInit(args.rgvarg);
       args.rgvarg[0].vt = VT_BSTR;
       args.rgvarg[0].bstrVal = SysAllocString(L"File=\"C:\\base\";Usr=\"Администратор\""); 
       hr = pv8->Invoke(dispIDInitialize,IID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,&args,NULL,NULL,NULL);
              if (FAILED(hr))
        {
            AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
            if (pv8) pv8->Release();
            delete [] args.rgvarg;
            CoUninitialize();
            return;
        }
//------------------------------------------------------------------------------------------------
    DISPID dispidFunc;
    LPOLESTR sFunc = L"ExternalDataProcessors";
    hr = pv8->GetIDsOfNames(IID_NULL, &sFunc, 1, 0, &dispidFunc); 
    if (FAILED(hr))
    {
        AfxMessageBox(_com_error(GetLastError()).ErrorMessage(),MB_ICONSTOP);
        AfxMessageBox(_com_error(hr).ErrorMessage(),MB_ICONSTOP);
        if (pv8) pv8->Release();
        delete [] args.rgvarg;
        CoUninitialize();
        return;
    }
    //----------------------------------------------------------------------------------
        pv8->Release();
       CoUninitialize();
       SysFreeString(args.rgvarg[0].bstrVal);
       delete [] args.rgvarg;
}


В случае V83.Application вызов метода "ExternalDataProcessors" (для запуска в базе 1с внешней обработки) проходит положительно,
а в случае V83.COMConnector получаю сообщение от hr = Unknown name.

Соединение с базой выполняется в обоих случаях без ошибок.
В других системах программирования при варианте V83.COMConnector метод "ExternalDataProcessors" вызывается, но почему тут не работает, в чем трабл?
Re[11]: Работа из VC++ с базой 1С83 через V83.COMConnector
От: saf_e  
Дата: 19.02.15 12:59
Оценка:
Здравствуйте, SANblCH_SUN, Вы писали:

SAN>Продолжаю тему!

SAN>Я привел два варианта кода через V83.COMConnector и V83.Application к одному виду:

SAN>В случае V83.Application вызов метода "ExternalDataProcessors" (для запуска в базе 1с внешней обработки) проходит положительно,

SAN>а в случае V83.COMConnector получаю сообщение от hr = Unknown name.

SAN>Соединение с базой выполняется в обоих случаях без ошибок.

SAN>В других системах программирования при варианте V83.COMConnector метод "ExternalDataProcessors" вызывается, но почему тут не работает, в чем трабл?

Посмотрите какие методы доступны у этого объекта.

http://stackoverflow.com/questions/2112302/enumerate-com-object-idispatch-methods-using-atl последний ответ COMTools::GetIDispatchMethods. Там же сможете расковырять параметры которые ожидаются.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.