Шрифт:
//////////////////////////////////////////////////
// СоJournal.h: заголовочный файл для класс СоJournal.
//////////////////////////////////////////////////
#ifndef _CoJournal_
#define _CoJournal_
#include "IJournal.h"
#include "iid.h"
class CoJournal:
public IJournal
{
public:
CoJournal ;
virtual ~CoJournal;
// IUnknown
STDMETHODIMP Querylnterface(REFIID riid, void** pIFace);
STDMETHODIMP_(ULONG) AddRef;
STDMETHODIMP_(ULONG) Release;
// IPub
STDMETHOD(SetTitle)(BSTR bstrTitle);
STDMETHOD(SetYear)(int nYear);
STDMETHOD(Getlnfo)(BSTR* pbstrlnfo);
// IJournal
STDMETHOD(SetNumber)(int nNumber);
private:
ULONG m_refCount; // Счетчик ссылок
BSTR m_bstrTitle; // Название публикации
int m_nYear; // Год публикации
int m nNumber; // Номер журнала
};
#endif
И теперь реализация класса CоJournal
//////////////////////////////////////////////////
// СоJournal.cpp: реализация класса CoJournal.
//////////////////////////////////////////////////
#include <stdio.h>
#include "CoJournal.h"
#include <stdio.h>
#include "CoJournal.h"
extern ULONG g_objCount; // Счетчик числа объектов
//////////////////////////////////////////////////
// Конструктор и деструктор
//////////////////////////////////////////////////
CoJournal::CoJournal
{
m_refCount = 0;
++g_obj Count;
m_bstrTitle = SysAllocString(L"");
}
CoJournal::~CoJournal
{
– - g_objCount;
if(m_b strTitle)
SysFreeString(m_bstrTitle);
}
// IUnknown
STDMETHODIMP_(ULONG) CoJournal::AddRef
{
return ++m_refCount;
}
STDMETHODIMP_(ULONG) CoJournal::Release
{
if (--m_refCount == 0)
{
delete this;
return 0;
}
else
return m_refCount;
}
STDMETHODIMP CoJournal::Querylnterface(REFIID riid, void** pIFace)
{
if (riid == IID_IUnknown)
{
*pIFace = (IUnknown*)this;
}
else if (riid == IID_IJournal)
{
*pIFace = (IJournal*)this;
}
else
{
*pIFace = NULL; return E_ NOINTERFACE;
}
((IUnknown*)(*pIFace)) — > AddRef;
return S_OK;
}
// IPub & IJournal
STDMETHODIMP CoJournal::SetTitle (BSTR bstrTitle)
{
SysReAllocString(&m_bstrTitle, bstrTitle);
return S_OK;
}
STDMETHODIMP CoJournal::SetYear(int nYear)
{
m_nYear = nYear;
return S_OK;
}
STDMETHODIMP CoJournal::SetNumber(int nNumber)
{
m_nNumber = nNumber;
return S_OK;
}
STDMETHODIMP CoJournal::GetInfo(BSTR *pbstrInfo)
{
char* pszTitle = NULL;
char* pszText = NULL;
int nTitleLength;
nTitleLength = SysStringLen(m_bstrTitle);
pszTitle = (char*)malloc(2*nTitleLength);
pszText = (char*)malloc(2*nTitleLength + 50);
wcstombs(pszTitle, m_bstrTitle, 2*nTitleLength);
sprintf(pszText, "Journal\n\nTitle: %s\nYear: %d\nNumber: %d\n", pszTitle, m_nYear, m_nNumber);
*pbstrInfo = SysAllocStringLen(NULL, 2*strlen(pszText));
mbstowcs(*pbstrlnfo, pszText, 2*strlen(pszText));
free(pszTitle);
free(pszText);
return S_OK;
}
Теперь, когда коклассы CoBook и CоJournal реализованы, им следует присвовить GUID и добавить соответствующую информацию в файл iid.h. Вот последняя версия этого файла
// GUID для всех интерфейсов и классов