2009-09-24 4 views
0

У меня есть COM-компонент ATL C++ in-proc. Этот компонент не предназначен для внешнего использования - мне он нужен только для использования в нашем приложении.Можно ли запретить вставлять мой компонент in-proc в COM +?

Время от времени пользователи помещают его в COM +, и это приводит ко всем видам странных ошибок - «Доступ запрещен» и т. Д., О которых я бы хотел просто не слышать. Лучшим способом было бы сделать что-то, что запрещало бы поместить компонент в COM +, чтобы его можно было использовать только как сервер proc. Есть ли способ сделать это?

ответ

1

Вы реализуете только свои собственные интерфейсы? Если это так, вы должны иметь возможность отмечать их «[local]» в IDL, а затем линять модуль всей информации сортировки (тип библиотеки, P/S) и т. Д.

Если нет оснований для сортировки , COM + не должен регистрировать модуль. Механизм перехвата COM + полагается на принуждение объектов в удаленный контекст и попадание между прокси-сервером и заглушкой и их соответствующими сторонами. Таким образом, если вы удалите все возможности для сортировки, он не сможет перехватить ваши методы интерфейса.

+0

Я проверил все, что вы предлагаете, но COM + с удовольствием добавит компонент. Я предполагаю, что это будет непригодно - CoCreateInstance() потерпит неудачу с различными жалобами, такими как «интерфейс не поддерживается», - но на самом деле это та же самая проблема, с которой я начинал. Поэтому вместо того, чтобы фиксировать проблему, я сузил поверхность, из которой она могла исходить. Обычно пользователи добавляют наш компонент, потому что его ProgID находится в списке зарегистрированных компонентов и похож на ProgID других наших компонентов. Поэтому они просто «добавляют все». Я изменил код регистрации реестра, чтобы он предоставлял ClassId ... – sharptooth

+0

... и надеюсь, что проблема никогда не будет беспокоить нас снова. Большое спасибо за предложения в любом случае - теперь мы знаем, что эти шаги на самом деле не решают проблему. – sharptooth

+0

Спасибо за последующую информацию! –

1

Предотвращение регистрации вашего модуля завершено, а затем используйте вашу DLL, как описано в этой статье Creating COM objects directly from the dll.

+0

Отличная идея. Тем более, что я всегда перераспределяю COM-компонент, и он всегда находится в той же папке, что и его потребитель. – sharptooth