Re[6]: Отлаживай!
От: Аноним  
Дата: 08.01.03 09:23
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>1. Приведи содержание раздела реестра HKEY_CLASSES_ROOT\Interface\Твой интерфейс

Tom>2. Приведи содержание реестра по HKEY_CLASSES_ROOT\CLSID\Твой интерфейс

Tom>

Tom>ЗЫ: Ты случайно не ручками регестрируешь прокси/стаб Это конечно глупое предположение , но...

В общем проблему локализовал и убил. Спасибо всем, кто откликнулся!
Теперь расскажу суть, на тот случай, если кто с таким маразмом сталкнется.

Регистрация proxy/stub dll и интерфейса правильная, никаких ошибок... но...
Как вы знаете, когда midl компилирует proxy/stub dll (REGISTER_PROXY_DLL установлен), он выбирает CLSID для этой dll (СОМ объекта имеется в виду) как первый встретившийся IID интерфейса предоставляемый этой dll:

// rpcproxy.h

#define GET_DLL_CLSID   \
    ( aProxyFileList[0]->pStubVtblList[0] != 0 ? \
    aProxyFileList[0]->pStubVtblList[0]->header.piid : 0)

...

// dlldata.c

DLLDATA_ROUTINES( aProxyFileList, GET_DLL_CLSID )


Так вот этим самым первым интерфейсом был интерфейс (IY), который также помещался в typelib и мог быть создан через мой exe сервер. (Это и был баг, этот интерфейс не должен был попадать в proxy/stub dll) И вот какая ситуация: клиент пытается запросить интерфейс IX (см. выше), СОМ ищет IID этого интерфейса в регистри, находит, смотрит ключ ProxyStubClsid32, находит IID интерфейса IY и дальше, он видит, что этот объект создается с помощью моего сервера (не прокси dll), т.к от объявлен в typelib сервера и сервер регистрирует что он создает этот объект. Поэтому СОМ ни разу не обращался в регистри к ключу CLSID моей proxy/stub dll.
Короче грабли!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.