Требуется одиночный COM-объект - PullRequest
5 голосов
/ 06 июня 2011

Можно ли создать один экземпляр COM-объекта и быть уверенным, что все последующие вызовы от любого клиента будут выполняться только для этого единственного экземпляра?

1 Ответ

8 голосов
/ 30 июня 2012

Обратите внимание, что вам придется заставить свой COM-объект работать вне процесса (выставляется EXE).

Вам действительно нужен один и тот же COM-объект, используемый везде?Или вы просто хотите управлять одними и теми же базовыми ресурсами из одной контрольной точки?

COM не поддерживает шаблон Singleton напрямую, но и не запрещает его строго.Просто нет параметра реестра, который говорит "всегда обслуживать один и тот же объект".Фактически, стандартный механизм создания экземпляров COM требует , чтобы каждый раз при его вызове возвращался действительно новый объект (этот механизм используется для внутренних операций new операторов и CreateInstance()).Это означает, что для создания правильного синглтона COM вы не можете позволить своим клиентам создавать его самостоятельно.Это все можно сделать, но это сложно и редко необходимо.

Ваша лучшая ставка - достаточно забавная - вообще НЕ иметь COM-синглтона.Позвольте клиенту создавать столько разных объектов, сколько он хочет.Вместо одного COM-объекта разрешите несколько COM-объектов, но сделайте эти объекты «прокладками», которые взаимодействуют с реализацией одного внутреннего объекта.Не раскрывайте внутреннюю одноэлементную реализацию непосредственно как COM-объект.Вы избежите многих головных болей.

...