event1.cpp

来自「Thinkinc++English 电子书籍,英文版」· C++ 代码 · 共 56 行

CPP
56
字号
// Event1.cpp : Implementation of CEvent1
#include "stdafx.h"
#include "Simple11.h"
#include "Event1.h"

/////////////////////////////////////////////////////////////////////////////
// CEvent1


STDMETHODIMP CEvent1::Add(long n1, long n2)
{
	long nResult = n1 + n2;
	for( int i=0; i<10; i++)
	{
		if( m_pCallBack[i] )						// 如果回调接口有效
			m_pCallBack[i]->Fire_Result( nResult );	// 则发出事件/通知
	}

	return S_OK;
}

STDMETHODIMP CEvent1::Advise(ICallBack *pCallBack, long *pdwCookie)
{
	if( NULL == pCallBack )		// 居然给我一个空指针?!
		return E_INVALIDARG;

	for( int i=0; i<10; i++)	// 寻找一个保存该接口指针的位置
	{
		if( NULL == m_pCallBack[i] )	// 找到了
		{
			m_pCallBack[i] = pCallBack;	// 保存到数组中
			m_pCallBack[i]->AddRef();	// 指针计数器 +1

			*pdwCookie = i + 1;			// cookie 就是数组下标
										// +1 的目的是避免使用0,因为0表示无效

			return S_OK;
		}
	}
	return E_OUTOFMEMORY;	// 超过10个连接,内存不够用啦
}

STDMETHODIMP CEvent1::Unadvise(long dwCookie)
{
	if( dwCookie<1 || dwCookie>10 )	// 这是谁干的呀?乱给参数
		return E_INVALIDARG;

	if( NULL == m_pCallBack[ dwCookie - 1 ] )	// 参数错误,或该接口指针已经无效了
		return E_INVALIDARG;

	m_pCallBack[ dwCookie -1 ]->Release();	// 指针计数器 -1
	m_pCallBack[ dwCookie -1 ] = NULL;		// 空出该下标的数组元素

	return S_OK;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?