I have been trying something which may turn to be impossible in the end. It's been a long while since I've been in COM land.
Consider two apps and a COM STA DLL. First app loads COM STA DLL as a plugin and this DLL tries to register itself "globally" so that the second app sees it. Something like GetObject("Excel.Application")
.
I have tried two approaches (which may turn to be the same thing).
Approach 1: I have tried using CoRegisterClassObject
to register my STA instance of an object. This call succeeds with S_OK
. But if I try to GetActiveObject
using the same CLSID immediately after CoRegisterClassObject
, I get MK_E_UNAVAILABLE - 0x800401e3
.
Is GetActiveObject
the wrong API to call? If not, why would it fail?
Approach 2: I have also tried using GetRunningObjectTable
, IRunningObjectTable:Register
and CreateClassMoniker
but when trying to get to the object from ROT in a second app, I am faced with another failure.
My STA DLL is properly registered and uses typelib for marshaling (which is also registered).
Am I missing something or is what I am trying to do not possible at all? If latter, are there any simple alternatives for me?
It seems when you want to use GetActiveObject
your friends are RegisterActiveObject
and RevokeActiveObject
. I was totally off. It works perfectly now! I hope this helps someone.
User contributions licensed under CC BY-SA 3.0