Допустимо ли использование глобального объекта в качестве фабрики класса COM? - PullRequest
2 голосов
/ 29 июля 2011

В COM-сервере out-proc мне нужна фабрика классов, которую я передам CoRegisterClassObject(). CreateInstance() будет использовать только new для создания экземпляров объекта и не нуждается в сохраненных данных. LockServer() изменит счетчик общей блокировки, не относящийся к заводскому экземпляру.

Так что на самом деле мне не нужно хранить какие-либо особые данные внутри фабрики, и только один объект подойдет. Также я не хочу заботиться о жизни этого объекта. Вот почему я испытываю желание объявить фабрику как глобальную переменную (в конструкторе для refcount установлено значение 1):

//Server.cpp
CMyFactory factory;

Как только я это сделаю, я больше не удовлетворен delete this внутри Release() - этот код никогда не должен запускаться при нормальных условиях (refcount начинается с 1 и никогда не достигает нуля), и если он выполняется, это приводит к неопределенному поведению. Поэтому я думаю об удалении счетчика ссылок с завода и реализации AddRef() и Release() следующим образом:

ULONG CMyFactory::AddRef()
{
   return 1;
}
ULONG CMyFactory::Release()
{
   return 1;
}

Так что подсчет ссылок не будет иметь никаких побочных эффектов, delete this.

Будет ли описанная реализация законной? Это вызовет проблемы?

Ответы [ 2 ]

1 голос
/ 29 июля 2011

Пока вы контролируете время жизни процесса по другому значению, это принимается. удалить это в этом случае является катастрофой, так как объект является глобальным, а не динамическим.

1 голос
/ 29 июля 2011

Да, это совершенно законно и даже задокументировано где-то в книгах COM.

...