Я просматриваю код, который имеет exe, имеющий COM-сервер (COM-класс, реализованный в ATL). Он имеет .idl-файл, имеющий все интерфейсы. Теперь после регистрации COM-сервера я просмотрел записи в реестре, и я мог найти следующее. Каждый интерфейс имеет запись со своим IID и имеет ProxyStubClsid32. Существует один интерфейс, который реализован сервером COM, который я упомянул, который имеет IID в ключевом поле = значение ProxyStubClsid32, и каждая другая запись интерфейса интерфейса имеет эту же запись IID в поле ProxyStubClsid32. Почему это так?Изменения в разделах реестра после добавления нового интерфейса и компонента для COM-сервера вне очереди.
Далее, когда я пытаюсь добавить новый интерфейс и новый COM-компонент, реализующий этот интерфейс для exe, и сделать регистрацию, что я мог наблюдать в реестре, было то, что теперь запись IID для этого нового интерфейса и его ProxyStubClsid32 одинакова. И недавно добавленный IID теперь присутствует в ProxyStubClsid32 всех других интерфейсов.
Что входит в ProxyStubClsid32, как это принято?
Я хочу, чтобы предыдущий IID присутствовал в ProxyStubClsid32 даже после добавления моего нового интерфейса. Как я могу это сделать ??
Также explorer.exe кэширует эту запись в реестре, поскольку я реализую расширение оболочки, которое загружает компонент, я думаю, что он ссылается на старые записи, поэтому запрос на новый интерфейс на этом exe не работает. После перезапуска explorer.exe все работает нормально.
Не могли бы также прокомментировать это.
Ответ на это, кажется, есть некоторые намеки на мою проблему: Registry keys for out-of-process COM server
Спасибо заранее.
Все, что вы описали, совершенно нормально. MIDL выбирает IID первого интерфейса в файле IDL в качестве CLSID прокси/заглушки. Таким образом, вы, вероятно, добавили новый интерфейс вверху. Не проблема, она явно перерегистрировалась должным образом. Нужно перезапустить Explorer. –
Есть ли способ, которым я могу противостоять MIDL от выбора нового IID, который я добавил, и заставить его забрать IID, который он изначально собирал, так что мне не нужно перезапускать explorer.exe ?? –
Я уже упоминал это. Не устанавливайте новый интерфейс сверху. –