Я пытался что-то, что может оказаться невозможным в конце концов. Прошло много времени с тех пор, как я был на земле 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 для маршалинга (который также зарегистрирован).
Я что-то упускаю или то, что я пытаюсь сделать, вообще невозможно? Если последнее, есть ли для меня простые альтернативы?