Проблемы с доступом к объекту STA из другого процесса - PullRequest
1 голос
/ 08 февраля 2012

Я пытался что-то, что может оказаться невозможным в конце концов. Прошло много времени с тех пор, как я был на земле COM.

Рассмотрим два приложения и библиотеку COM STA. Первое приложение загружает COM STA DLL в качестве плагина, и эта DLL пытается зарегистрировать себя «глобально», чтобы второе приложение его увидело. Что-то вроде GetObject("Excel.Application").

Я пробовал два подхода (которые могут оказаться одинаковыми).

Подход 1. Я пытался использовать CoRegisterClassObject для регистрации моего экземпляра STA объекта. Этот вызов успешно выполняется с S_OK. Но если я попытаюсь GetActiveObject использовать тот же CLSID сразу после CoRegisterClassObject, я получу MK_E_UNAVAILABLE - 0x800401e3.

Является ли GetActiveObject неправильным API для вызова? Если нет, то почему бы это не сработало?

Подход 2. Я также пытался использовать GetRunningObjectTable, IRunningObjectTable:Register и CreateClassMoniker, но при попытке добраться до объекта из ROT во втором приложении я столкнулся с еще одной ошибкой.

Моя STA DLL правильно зарегистрирована и использует typelib для маршалинга (который также зарегистрирован).

Я что-то упускаю или то, что я пытаюсь сделать, вообще невозможно? Если последнее, есть ли для меня простые альтернативы?

1 Ответ

1 голос
/ 08 февраля 2012

Кажется, когда вы хотите использовать GetActiveObject ваши друзья RegisterActiveObject и RevokeActiveObject. Я был полностью выключен. Теперь работает отлично! Надеюсь, это кому-нибудь поможет.

...