📄 simpleerr.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 + -