Запишите то, что я узнал из комментариев:
Вам не нужно использовать CoCreateInstance
, но вы можете использовать GetActiveObject
, что
Извлекает указатель на работающий объект, который был зарегистрирован в OLE.
, так что у вас есть способ получить объект, не активируя его, но полагаясь на то, что он ужезарегистрировано.(Но это не делается с помощью CoRegosterClassObject
, вместо этого вам нужно ...?)
Подобно подходу GetActiveObject
, вы можете использовать оборудование вокруг IRunningObjectTable
- что может бытьчто используется GetActiveObject в любом случае.я там немного потерян.
Другая информация состоит в том, что реестр считается "необязательным" во всем этом: (перефразируя)
CoRegisterClassObject
- это просто публикация вашего объекта на COM (в качестве oop-сервера), ...
просто не регистрирует ваш объект CLSID
в реестре.Если сервер еще не вызвал CoRegisterClassObject
, клиент получает ошибку REGDB_E_CLASSNOTREG
, в противном случае достаточно вызвать CoRegisterClassObject
....
вам не нужно добавлять его в таблицу запущенных объектов - достаточно одного вызова CoRegisterClassObject
- после этого клиент может создать экземпляр.Нет необходимости в регистрации в реестре - ...
... для любого удаленного интерфейса вам, конечно, нужна запись в реестре Interface\{..}\ProxyStubClsid32
, но не нужна для CLSID
.
CoRegisterClassObject
вообще не нуждается в реестре ... Но вам все еще нужно маршал вашего интерфейса (ов).Для этого вам нужен ключ Interface\{..}\ProxyStubClsid32
.
TypeLib
, который вам нужен, если вы выполняете маршалинг этого типа - установите {00020424-0000-0000-C000-000000000046} здесь.CLSID
и AppID
вам не нужны.
CLSID
и APPID
вам нужны для запуска приложения, если оно не запущено (или загрузите dll).
Если вы уже работаете и звоните CoRegisterClassObject
- этого достаточно, чтобы клиентский звонок подключился к вам.Но без CLSID клиент не может выполнить ваше приложение (просто неизвестно, что).
Если вы не делаете пользовательский маршалинг - нужно, чтобы каждый интерфейс имел информацию в реестре - какой dll ProxyStubClsid32 делает это маршалинг.Это может быть либо пользовательская dll, либо стандартная {00020424-0000-0000-C000-000000000046}, тогда вам нужна библиотека типов для использования oleaut32.
In summary , может показаться, что способ предотвратить активацию приложения Windows - это
- НЕ записывать информацию, необходимую для активации, в реестр.
- , но требуется только информация, необходимая для маршалинга.
- и / или НЕ вызова
CoCreateInstance
и извлечения объекта по другому маршруту.