C++ запуск БП workflow из плагина Лоцман

Автор Chipollino, 15.03.17, 17:50:12

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Chipollino

Добрый день.
Возникла необходимость запустить из плагина лоцман бизнес процесс, но так как с подключением к COM объектам не работал зашёл в тупик.

По примеру из этого топика пытался сделать хоть что-то, но не получается - http://forum.ascon.ru/index.php/topic,17971.msg104076.html#msg104076

Как я понял должно быть как-то так:

   ::CoInitialize(NULL);
   ::CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_NONE,
      RPC_C_IMP_LEVEL_DELEGATE, NULL, 0, NULL);

   IClassFactory* pCF(NULL);
   CLSID clsid;
   // * IWF(NULL); // Должен быть указатель на структуру workflow
   HRESULT hr=::CLSIDFromString(OLESTR(/* GUID WF */),&clsid); // из MIDL
   hr = CoGetClassObject(clsid,CLSCTX_REMOTE_SERVER,NULL,IID_IClassFactory,(void **)&pCF);
   IID IDD_IWFProvider = __uuidof(/* указатель на WF */);
   hr = pCF->CreateInstance( NULL,IDD_IWFProvider, (void**) &IWF);

   if (hr == S_OK)
   {
...
   }


Лоцман 2013 sp2.
Из справки для бизнес-логики Workflow понял, что GUID вроде бы {3D7F4F8F-F8A2-4AC5-B9E7-48CBC7CD2749}, но без остальных неизвестных это и не проверить.

пробовал вот такой код в dll для автооперации workflow проверить, но IPC у меня всегда равен единице...

        ::CoInitialize(NULL);
::CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_NONE,
RPC_C_IMP_LEVEL_DELEGATE, /* 4 - уровень представления "Делегирование" */
NULL,
0,
NULL
);
IClassFactory* pCF(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromString(OLESTR("{392BA982-A82F-44AB-BA8A-69BE25199F73}"), &clsid);
hr = CoGetClassObject(clsid, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void**)&pCF);

if (hr == S_OK)
{
                IPluginCall * IPC(NULL);
IID IID_ILoodsman = __uuidof(IPluginCall);
hr = pCF->CreateInstance(NULL, IID_ILoodsman, (void**)&IPC);
               try
{
IPC->RunMethod(CComBSTR("GetDBList"), CComVariant(CComSafeArray<VARIANT>(2)), &ret);
}
catch (...)
{
MessageBox(NULL, "Исключение", "RunMethod", MB_ICONERROR); // Почему-то не отлавливается...
}

}
else
MessageBox(NULL, "Ошибка!", "CoGetClassObject", MB_ICONERROR);


Если у кого-то есть готовый пример подключения к COM объектам лоцмана на C++ буду очень признателен.

Chaa

В плагин передается интерфейс IPluginCall, с помощью его функций RunMethod/GetDataSet можно обращаться к серверу приложений.
Для вызова функции Workflow нужно добавить префикс WF, например для вызова CreateNewProcess нужно указать имя WFCreateNewProcess.

Вот еще:
http://forum.ascon.ru/index.php/topic,12560.msg88880.html#msg88880
+ Благодарностей: 1

Chipollino

Вот даже так...
А я думал, что этот момент только для скриптов автоопераций workflow актуален и даже не думал его попробовать в плагине лоцмана))) Теперь буду знать.

По второму варианту ещё не пробовал, но думаю тоже разберусь.
Спасибо.