⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simpleerr.cpp

📁 Thinkinc++English 电子书籍,英文版
💻 CPP
字号:
// SimpleErr.cpp : CSimpleErr 的实现

#include "stdafx.h"
#include "SimpleErr.h"
#include ".\simpleerr.h"


// CSimpleErr

STDMETHODIMP CSimpleErr::InterfaceSupportsErrorInfo(REFIID riid)
{
	static const IID* arr[] = 
	{
		&IID_ISimpleErr
	};

	for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		if (InlineIsEqualGUID(*arr[i],riid))
			return S_OK;
	}
	return S_FALSE;
}

// 最简单形式的错误表现方式
STDMETHODIMP CSimpleErr::Div1(LONG n1, LONG n2, LONG * pVal)
{
	if( 0 == n2 )				// 如果除数为 0
		return E_INVALIDARG;	// 则认为是参数错误

	*pVal = n1 / n2;

	return S_OK;
}

// 使用 IErrorInfo 接口的原理性代码
STDMETHODIMP CSimpleErr::Div2(LONG n1, LONG n2, LONG* pVal)
{
	if( n2 )
	{
		*pVal = n1 / n2;
		return S_OK;
	}

	HRESULT hr;
	CComQIPtr< ICreateErrorInfo> spCEI;	// 声明 ICreateErrorInfo 接口指针
	hr = ::CreateErrorInfo( &spCEI );	// 构造它
	if( !spCEI )	return E_FAIL;		// 其实,这种情况不可能发生

	spCEI->SetGUID( IID_ISimpleErr );	// 如果是系统定义的错误,也可以使用 GUID_NULL
		
	LPOLESTR pProgID = NULL;
	hr = ::ProgIDFromCLSID( CLSID_SimpleErr, &pProgID );	// 取得 ProgID
	if( SUCCEEDED( hr ) && pProgID )
	{
		spCEI->SetSource( pProgID );	// 设置错误源,也就是组件的 ProgID
		::CoTaskMemFree( pProgID );		// 释放内存
	}
// 上面是通用的方法。其实你当然知道正在书写的组件的 ProgID 了
// 所以不用动态取得 ProgID 也可。你可以这样书写
// spCEI->SetSource( L"Simple10.SimpleErr.1" ); ProgID 可以在 rgs 文件中看到

// 如果你的组件同时提供了帮助文件,那么就可以:
//	spCEI->SetHelpContext( 0 );			// 设置帮助文件的主题号
//	spCEI->SetHelpFile( L"xxx.hlp" );	// 设置帮助文件的文件名

	spCEI->SetDescription( L"除数不能为0" );	// 设置错误的文字描述

	CComQIPtr < IErrorInfo > spErrInfo = spCEI;	// QueryInterface 得到 IErrorInfo
	if( spErrInfo )
		::SetErrorInfo( 0, spErrInfo );		// 这时调用者就可以得到错误信息了

	return E_FAIL;
}

// 使用 CComCoClass::Error() 方式,便捷地设置错误信息
STDMETHODIMP CSimpleErr::Div3(LONG n1, LONG n2, LONG* pVal)
{
	if( 0 == n2 )
		return Error( L"除数不能为0" );

	*pVal = n1 / n2;

	return S_OK;
}

⌨️ 快捷键说明

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