=>нехочет инициализироваться ОЛЕ объект 1С:предприятия...
извиняюсь не ту кнопку при ответе нажал
ты v77.application запускаешь из своей программы?
или наоборот из 1С свой COM-объект?
COM-объект для 1C должен реализовывать IDispatch. подробно это было в книжечке ихней описано ("Технология создания внешних компонент")
=>>Пример с MSDEV.application работает исправно, но для V77.application не хочет правильно реагировать на QueryInterface.
=>>CLSID взят из реестра. A>напиши кусок кода как ты его создаешь.
Вот:
HRESULT hr;
const wchar_t *V77=L"V77.Application";
const unsigned int FuncNum(5);
wchar_t *FuncNames[FuncNum]={L"Initialize",L"EvalExpr",L"CreateObject", L"ExecuteBatch",L"RMTrade"};
CLSID id1C;
hr = CLSIDFromProgID(V77, &id1C);
IUnknown *punk=NULL;
hr = CoCreateInstance(id1C, NULL, CLSCTX_ALL | CLSCTX_REMOTE_SERVER, IID_IUnknown, (void**)&punk);
hr = OleRun(punk);
Здравствуйте Awaken, Вы писали:
A>Здравствуйте -=Al=-, Вы писали:
=>>нехочет инициализироваться ОЛЕ объект 1С:предприятия... A>извиняюсь не ту кнопку при ответе нажал
?!?
A>ты v77.application запускаешь из своей программы?
Да.
A>или наоборот из 1С свой COM-объект?
Из 1С не надо. Требуетсяиспользовать возможности 1С:предприятия в своих целях.
A>COM-объект для 1C должен реализовывать IDispatch. подробно это было в книжечке ихней описано ("Технология создания внешних компонент")
Поцетировать можешь? чуть-чуть...
A>>COM-объект для 1C должен реализовывать IDispatch. подробно это было в книжечке >ихней описано ("Технология создания внешних компонент")
=> Поцетировать можешь? чуть-чуть...
ой я так давно этим не занимаюсь ибо в штатах сижу 2 года как.
зайди на форум 1С-Профессионал , там народ ее на ftp выкладывал.
A> IDispatch *pdisp=NULL;
A> hr = CoCreateInstance(id1C, NULL, CLSCTX_LOCAL_SERVER,IID_IDispatch, (void**)&pdisp);
A> CComBSTR name="RMTrade";
A> DISPID id_rmtrade=0;
A> hr=pdisp->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &id_rmtrade);
A>
Спасибо, заработало. Кроме того я забыл вставить OleInitalization, но это мелочь (: А кто то ещё говорил, что бейсик-строка здесь непричём... помошничики.
A> ;)
А можно немного рассказать как в Invoke передавать параметры, вызываемой в её теле функции. Быду очень признателен. Это главным образом относится к:
V77.Initialization(V77.RMTrade, ...); Нужно запустить эту конструкцию в MSVC.
=> Спасибо, заработало. Кроме того я забыл вставить OleInitalization, но это мелочь (: А кто то ещё говорил, что бейсик-строка здесь непричём... помошничики.
A>>
=> А можно немного рассказать как в Invoke передавать параметры, вызываемой в её теле функции. Быду очень признателен. Это главным образом относится к:
=> V77.Initialization(V77.RMTrade, ...); Нужно запустить эту конструкцию в MSVC.
=> Спасибо, заработало. Кроме того я забыл вставить OleInitalization, но это мелочь (: А кто то ещё говорил, что бейсик-строка здесь непричём... помошничики.
Бейсик-строка здесь действительно непричём. А причём, так это строка с 2-мя байтами на символ, а не обычные С-шные строки!
IDispatch *pdisp=NULL;
hr = CoCreateInstance(id1C, NULL, CLSCTX_LOCAL_SERVER,IID_IDispatch, (void**)&pdisp);
LPOLESTR name = OLESTR("RMTrade");
// или
// LPOLESTR name = L"RMTrade";
DISPID id_rmtrade=0;
hr=pdisp->GetIDsOfNames(IID_NULL, &name, 1, LOCALE_SYSTEM_DEFAULT, &id_rmtrade);
=> А можно немного рассказать как в Invoke передавать параметры, вызываемой в её теле функции.
Здравствуйте Vi2, Вы писали:
Vi2>Бейсик-строка здесь действительно непричём. А причём, так это строка с 2-мя байтами на символ, а не обычные С-шные строки!
Ну дк, ежу понятно, что это юникод. А всё-таки, что ести буква 'B' в названии CComBSTR? Кроме того Билли придумал использовать при взаимодействии с оле-объектами булевы типы совместимые с этим, т.н. "языком программирования"... аж противно. Всё это (и ещё кое-что) и создало такое впечатление.
Всё это здорово, но, если я не ошибаюсь COleDispatchDriver из MFC. Я их немного недолюбливаю. Здесь кто-то писал, что этот класс есть не только в составе MFC. Как его подключить?
Здравствуйте -=Al=-, Вы писали:
Al> Здесь так всё запутено (с DISPPARAMS). Есть русский вариант?
А оно везде запутано. Русский вариант был мне без надобности: в английской документации всё без искажения переводчиков (а для себя я — не в счёт). Так что не знаю, есть ли он вообще.
Здравствуйте Vi2, Вы писали:
Vi2>А оно везде запутано. Русский вариант был мне без надобности: в английской документации всё без искажения переводчиков (а для себя я — не в счёт). Так что не знаю, есть ли он вообще.
Ладно, пойдём другим путём:
Насколько я понял, в cArgs помещаем количество параметров, в rgvarg указатель на массив VARIANTов с описаниями для каждого из них (о VARIANT потом). А теперь самое интересное: cNamedArgs — это идентификаторы OLE-приложения, если я не ошибаюсь. Точнее их количество. Но вот что помещать в rgdispidNamedArgs? Может быть указатель на массив индексов rgvarg, где они сидят или их ID-шки?
Здравствуйте -=Al=-, Вы писали:
Al>Насколько я понял, в cArgs помещаем количество параметров, в rgvarg указатель на массив VARIANTов с описаниями для каждого из них (о VARIANT потом).
Да, всё верно. Единственная тонкость здесь — реверсивный порядок аргументов в rgvarg по сравнению с положением их в описании функции.
Al>А теперь самое интересное: cNamedArgs — это идентификаторы OLE-приложения, если я не ошибаюсь. Точнее их количество.
cNamedArgs — это количество поименованных аргументов при вызове функции. На С/С++, как правило, он равен 0, за исключением вызова свойства put или putref, когда равен 1 и rgdispidNamedArgs = & { DISP_PROPERTYPUT }.
Al>Но вот что помещать в rgdispidNamedArgs? Может быть указатель на массив индексов rgvarg, где они сидят или их ID-шки?
А, соответственно, rgdispidNamedArgs — это DISPID-ы этих поименованных аргументов. пример одного см. выше. Их получают при вызове GetIDsOfNames, передавая с именем функции и имена поименованных аргументов. Напрмер, для примера ниже GetIDsOfNames( ... , & { "Func", "b" }, ... ).
Именованные аргументы всегда располагаются в начале массива rgvarg, т.е. позиционально соответствуют rgdispidNamedArgs. rgdispidNamedArgs[n] — это DISPID аргумента, а rgvarg[n] — его значение.
Пример: Func([in] long a, [in] long b, [in] long c, [in] long d ).
Здравствуйте Vi2, Вы писали:
Vi2>Пример: Func([in] long a, [in] long b, [in] long c, [in] long d ). Vi2>Вызываем Func(vara,varb,varc,vard): cArgs = 4 rgvarg = & { variant(long(vard)), variant(long(varc)), variant(long(varb)), variant(long(vara)) } cNamedArgs = 0 rgdispidNamedArgs = NULL
Vi2>Вызываем Func(b:=varb,vara,varc,vard): cArgs = 4 rgvarg = & { variant(long(varb)), variant(long(vard)), variant(long(varc)), variant(long(vara)) } cNamedArgs = 1 rgdispidNamedArgs = & { dispid_of_b /*скорее всего 2*/ }.
Ещё я попробовал сделать на MFC, но почемуто не хочет нормально инициализироваться 1С. Само приложение запускается, а возврат получается нулевой, то есть:
Здесть после выполения init==0... вроде всё перепробовал ): И ещё, имеет ли значание в каком режиме запускается предприятие?
Естественно после всего этого геморроя CreateObject не выполняется.
Здравствуйте -=Al=-, Вы писали:
Al> Ещё я попробовал сделать на MFC, но почемуто не хочет нормально инициализироваться 1С. Само приложение запускается, а возврат получается нулевой, то есть:
Al> Здесть после выполения init==0... вроде всё перепробовал ): И ещё, имеет ли значание в каком режиме запускается предприятие? Al> Естественно после всего этого геморроя CreateObject не выполняется.
Ну что тебе сказать? Я с 1С не работал, так что конкретно не знаю. Всякое может быть.
Однако, чисто с позиций СОМ, передавать (void*)(LPCTSTR)strPath вместо BSTR (тэг VTS_BSTR) — ошибочно. BSTR — это не LPCWSTR (2 байта на символ) и уж тем более не LPСSTR (1 байт на символ).
Используй вместо CString классы _bstr_t или CComBSTR или метод CString::AllocSysString с последующим освобождением возвращаемого указателя.
Vi2>Однако, чисто с позиций СОМ, передавать (void*)(LPCTSTR)strPath вместо BSTR (тэг VTS_BSTR) — ошибочно. BSTR — это не LPCWSTR (2 байта на символ) и уж тем более не LPСSTR (1 байт на символ).
Vi2>Используй вместо CString классы _bstr_t или CComBSTR или метод CString::AllocSysString с последующим освобождением возвращаемого указателя.
Оно заработало. Нужен был режим конфигуратора и ещё один момент.