2010-06-20 3 views
2

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

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

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

основные взгляды

Application1 как это:
основные выглядит

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? Ugh, так запутано ...

ответ

1

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

Смежные вопросы