Здравствуйте, saf_e, Вы писали:
_>Здравствуйте, 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. Там же сможете расковырять параметры которые ожидаются.
Мое приложение в MFC построено, а там идет речь за ATL
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Здравствуйте, saf_e, Вы писали:
_>>Посмотрите какие методы доступны у этого объекта.
_>>http://stackoverflow.com/questions/2112302/enumerate-com-object-idispatch-methods-using-atl последний ответ COMTools::GetIDispatchMethods. Там же сможете расковырять параметры которые ожидаются.
SAN>Мое приложение в MFC построено, а там идет речь за ATL
Это просто пример кода, тоже самое можно на голом СОМ сделать. И исключительно с целью отладки.
Здравствуйте, SANblCH_SUN, Вы писали:
SAN>Здравствуйте, saf_e, Вы писали:
_>>Здравствуйте, SANblCH_SAN, Вы писали:
SAN>>>Прошу помочь дописать программу VC++ 2010 MFC:
SAN>>>соединение с базой 1C выполняется а как дальше, как какие-нибудь данные получить? как выполнить в базе 1с внешнюю обработку?
_>>Используйте для работы с СОМ врапперы: _com_ptr_t, _variant_t, _bstr_t и т.д. ну или свои. СОМ и так своеобразен чтобы с ним вручную возится. Сделайте себе враппер для IDispatch и наступит счастье.
_>>По теме, надо курить объектную модель которая торчит из IDispatch и пробовать вызывать методы. Есть подозрение что они могут быть в документации к 1С. Гугл что говорит?
SAN>так случилось что что я плохо знаю язык С++, но надо дописать программу, поэтом мне был бы понятней простой пример.
SAN>есть у меня рабочий пример работы с базой 1с через V83.Application, но он мне не нравится:
SAN>SAN>void CExcelTestDlg::OnBnClickedTest2()
SAN>{
SAN> HRESULT hr;
SAN> VARIANT varRet;
SAN> CLSID cls8;
SAN> hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
SAN> if( FAILED(hr) ) // проверка на присутствие 1С Automation Sever-а
SAN> {
SAN> AfxMessageBox(_T("Переустановите 1С Предприятие!"));
SAN> return;
SAN> }
SAN> CString m_strPath = _T("C:\\base");
SAN> CString m_Usr = _T("Администратор");
SAN> CString m_Pwd = _T("");
SAN> varRet = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");
SAN> if( (varRet.vt != VT_BOOL)||(varRet.boolVal == 0) ) // проверка удачно/не удачно
SAN> {
SAN> AfxMessageBox(_T("Невозможно подключиться к базе 1С Предприятия"));
SAN> v8COMBase.Release();
SAN> return;
SAN> }
SAN> CDispatchHelper v8SpravPol; // наш справочник
SAN> v8SpravPol = v8COMBase.Invoke(L"NewObject", L"СправочникМенеджер.Пользователи");
SAN> if( !v8SpravPol )
SAN> {
SAN> AfxMessageBox(_T("Невозможно подключиться к [Справочник.Пользователи]"));
SAN> v8COMBase.Release();
SAN> return;
SAN> }
SAN> CDispatchHelper v8Admin; // наш Админ :)
SAN> v8Admin = v8SpravPol.Invoke(L"НайтиПоНаименованию", L"Администратор", false, (IDispatch*)NULL, (IDispatch*)NULL);
SAN> if( !v8Admin )
SAN> {
SAN> AfxMessageBox(_T("Пользователь Администратор не найден"));
SAN> v8SpravPol.Release();
SAN> v8COMBase.Release();
SAN> return;
SAN> }
SAN> VARIANT varRet1; // переменная для хранения результата
SAN> varRet1 = v8Admin.Get(L"Наименование"); // получаем значение поля
SAN> AfxMessageBox(_T(CString(varRet1.bstrVal))); // выводим сообщение о прочитанном имени пользователя
SAN> v8Admin.Release(); // Админ
SAN> v8SpravPol.Release(); // справочник
SAN>}
SAN>
SAN>класс CDispatchHelper, находится тут:
SAN>http://files.rsdn.ru/120582/DispatchHelper.cpp
SAN>http://files.rsdn.ru/120582/DispatchHelper.h
SAN>Так вот, меняю я строку:
SAN>SAN>hr = v8COMBase.CreateInstance(L"V83.Application"); // создаем COM соединение с 1С
SAN>
SAN>На строку:
SAN>SAN>hr = v8COMBase.CreateInstance(L"V83.COMConnector"); // создаем COM соединение с 1С
SAN>
SAN>в классе CDispatchHelper, т.е :
SAN>http://files.rsdn.ru/120582/DispatchHelper.h
SAN>меняю строку
SAN>SAN>HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_LOCAL_SERVER);
SAN>
SAN>на строку:
SAN>SAN>HRESULT CreateInstance(LPCOLESTR sProgID, DWORD dwClsContext = CLSCTX_INPROC_SERVER);
SAN>
SAN>После этого ошибка:
SAN>Невозможно подключиться к базе 1С Предприятия
При COM соединении функция v8COMBase.Invoke(L"Connect", ... ) возвращает не VARIANT, а IDispatch*. т.е. писать надо так:
CDispatchHelper v8Connector = v8COMBase.Invoke(L"Connect", L"File=C:\\base;Usr=Администратор;Pwd=;");
Кроме того в ф-ции VARIANT Get(LPOLESTR sParam) и VARIANT Invoke(LPOLESTR sFunc, ...) необходимо добавить строку:
varRet.vt = 0;