2013-03-30 2 views
0

Я просматриваю код, который имеет 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

Спасибо заранее.

+0

Все, что вы описали, совершенно нормально. MIDL выбирает IID первого интерфейса в файле IDL в качестве CLSID прокси/заглушки. Таким образом, вы, вероятно, добавили новый интерфейс вверху. Не проблема, она явно перерегистрировалась должным образом. Нужно перезапустить Explorer. –

+0

Есть ли способ, которым я могу противостоять MIDL от выбора нового IID, который я добавил, и заставить его забрать IID, который он изначально собирал, так что мне не нужно перезапускать explorer.exe ?? –

+0

Я уже упоминал это. Не устанавливайте новый интерфейс сверху. –

ответ

0

Что такое ProxyStubClsid32 - это фактически интерфейс, используемый для сортировки по MIDL. Он используется, потому что ваши интерфейсы наследуются от IDispatch и необходимы, чтобы компилятор заботился о маршаллинге (в качестве своего OOP-сервера, вам нужно настроить сортировку).

Для нашей команды у нас возникли проблемы с регистрацией сервера на некоторых машинах (/ RegServer было недостаточно), но с использованием небольшого exe с этим кодом исправлены все проблемы с регистрацией (и, следовательно, проблема E_NOINTERFACE, которую вы можете иметь) , просто назовите его после каждой сборки или установки:

// Register the server 
      String^ l_TLB = l_Path + "\\MyServer.tlb"; 
      IntPtr l_TLBP = System::Runtime::InteropServices::Marshal::StringToBSTR(l_TLB); 
      ITypeLib *pTypeLib; 
      HRESULT hr; 
      hr = LoadTypeLibEx(static_cast<LPCOLESTR>(l_TLBP.ToPointer()), REGKIND_REGISTER, &pTypeLib); 
      if(SUCCEEDED(hr)) 
       pTypeLib->Release();