2011-07-29 2 views
2

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

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

//Server.cpp 
CMyFactory factory; 

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

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

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

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

ответ

1

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

1

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

Смежные вопросы