C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 26 - Реализуем фабрику классов / ActiveX по шагам / Приложение

Шаг 26 - Реализуем фабрику классов

Для начала два известных нам метода AddRef и Release. Они увеличивают и уменьшают счетчик ссылок.

STDMETHODIMP_(ULONG)  CClassFactory::AddRef()
{
	return  InterlockedIncrement(  &m_lRef  );
}

STDMETHODIMP_(ULONG)  CClassFactory::Release()
{
	if  (  InterlockedDecrement(  &m_lRef  )  ==  0  )
	{
		delete  this;
		return  0;
	}
	return m_lRef;
}

Соотвественно в конструкторе надо инициализировать переменную счетчик как ноль.

CClassFactory::CClassFactory()
{
	m_lRef  =  0;
}

Теперь нам нужно завести переменную, которая будет отвечать за блокировку сервера COM. Опишем её в основном модуле.

//
// mycom.cpp
//

#include  "windows.h"
#include  "ClassFactory.h"

long     g_lLocks  =  0;

Но она нам понадобится и для реализации метода LockServer, поэтому её надо объявить и перед объявлением фабрики класса.

// ClassFactory.h: interface for the CClassFactory class.
//
//////////////////////////////////////////////////////////////////////

.......

extern  long  g_lLocks;

class CClassFactory  : public IClassFactory
{
	......
}

Зачем нужен этот LockServer ??? Для того, чтобы сохранить в памяти модуль фабрики классов даже если к нему в данный момент нет обращения. Этому методу передаются параметры в виде FALSE и TRUE и количество вызовов этих методов долно быть пропорционально. Ну давайте этот метод реализуем.

STDMETHODIMP   CClassFactory::LockServer(  BOOL  fLock  )
{
	if  (  fLock  )
		InterlockedIncrement(  &g_lLocks  );
	else
		InterlockedDecrement(  &g_lLocks  );
	return  S_OK;
}

| |
Автор Каев Артем.
[AD]