Учебник по Visual C++ .Net

             

Создание класса СОМ-объекта Подключите


MY_COSAY_HEADER

#pragma once

class CoSay : public ISay

{

//=====Класс, реализующий интерфейсы ISay, lUnknown

public:

CoSay () ;

virtual -CoSay();

// lUnknown

HRESULT _stdcall Querylnterface(REFIID riid, void** ppv);

ULONG _stdcall AddRefO;

ULONG _stdcall Release ();

// ISay

HRESULT _stdcall Say();

HRESULT _stdcall SetWord (BSTR word);

private:

//====== Счетчик числа пользователей классом

ULONG m_ref; , //====== Текст, выводимый в окно

BSTR m word;

};

#endif

Для реализации тел методов класса CoSay подключите к проекту новый файл МуСоm. срр, в который введите коды, приведенные ниже. Обратите внимание на то, как принято работать со строками текста типа BSTR:

#include "interfaces.h"

#include "MyCom.h"

//====== Произвольный ограничитель длины строк

#define MAX_LENGTH 128

CoSay::CoSay()

{

//=== Обнуляем счетчик числа пользователей класса,

//=== так как интерфейс пока не используется

m_ref = 0;

//=== Динамически создаем строку текста по умолчанию

m_word = SysAllocString (L"Hi, there."

"This is MyCom speaking");

}

CoSay::-CoSay()

{

//=== При завершении работы освобождаем память

if (m_word)

SysFreeString(m_word);

}

//====== Реализация методов lUnknown

HRESULT _stdcall CoSay::QueryInterface(REFIID riid, void** ppv)

{

//====== Стандартная логика работы с клиентом

//====== Поддерживаем только два интерфейса

*ppv = 0;

if (riid==IID_IUnknown)

*ppv = static_cast<IUnknown*>(this) ;

else if (riid==IID_ISay)

*ppv = static_cast<ISay*>(this) ;

else

return E_NOINTERFACE;

//====== Есть пользователи нашим объектом

AddRef();

return S_OK;

}

ULONG _stdcall CoSay:-.AddRef ()

{

return ++m_ref;

}

ULONG _stdcall CoSay::Release{)

{

if (--m_ref==0) delete this;

return m_re f;

}

//====== Реализация методов ISay

HRESULT _stdcall CoSay::Say()

{

//=== Преобразование типов (из BSTR в char*), которое

//=== необходимо для использования MessageBox



Содержание  Назад  Вперед