Как разделить COM-объекты между двумя процессами? - PullRequest
2 голосов
/ 20 июня 2010

Я хочу, чтобы Application1.exe создавал экземпляр своего класса Item.
Я хочу, чтобы Application2.exe вызывал GetPrice () для этого объекта.

Я выполнил шаги 1-7на следующем веб-сайте:
http://www.codeguru.com/Cpp/COM-Tech/activex/tutorials/article.php/c5567/

Это то, что я имею до сих пор.

Основное приложение1 выглядит так:

CoInitialize( NULL );

DWORD dwRegister;
ItemFactory *pFactory = new ItemFactory;
CoRegisterClassObject( CLSID_Item, pFactory, CLSCTX_LOCAL_SERVER, REGCLS_MULTIPLEUSE, &dwRegister );

_getch();
return 0;

Основное в Application2 выглядит так:

CoInitialize( NULL );
CoGetClassObject( CLSID_Item, CLSCTX_LOCAL_SERVER, NULL, IID_IItem, (LPVOID *)&pFactory );

Моя проблема (надеюсь, моя единственная проблема) заключается в том, что я понятия не имею, как связать мой класс Item (или его интерфейс, IItem) с CLSID_Item;это просто какой-то случайный GUID, который я определил в другом файле.Я пытался

CoRegisterPSClsid( IID_IItem, CLSID_Item );

После этой строки я пытался

Item *pItem;
CoCreateInstance( CLSID_Item, NULL, CLSCTX_LOCAL_SERVER, IID_IItem, (LPVOID *)&pItem );

Я получаю ошибку E_NOINTERFACE.
Должен ли я создавать фабрику с CoCreateInstance?Тьфу, так растерялся ...

1 Ответ

1 голос
/ 19 июня 2011

Чтобы использовать COM через границы процессов или потоков, вы должны сообщить COM о ваших интерфейсах , чтобы он мог маршалировать аргументы вашей функции / возвращать значения между процессами. Самый простой способ сделать это - использовать предопределенный в системе интерфейс, такой как IDispatch, но если вы хотите использовать свой собственный, вы должны либо зарегистрировать прокси / заглушку DLL , либо a библиотека типов . Если вы этого не сделаете, то вызовы QueryInterface для вашего пользовательского интерфейса через COM-домены, как вы видите, завершатся с E_NOINTERFACE.

...