📄 simpleerr.cpp
字号:
// SimpleErr.cpp : Implementation of CSimpleErr
#include "stdafx.h"
#include "Simple9.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 *pResult)
{
if( 0 == n2 ) // 如果除数为0
return E_INVALIDARG; // 则认为是参数错误
*pResult = n1 / n2;
return S_OK;
}
// 使用 IErrorInfo 接口方式的原理性代码
STDMETHODIMP CSimpleErr::Div2(long n1, long n2, long *pResult)
{
if( n2 )
{
*pResult = 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"Simple9.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 *pResult)
{
if( 0 == n2 )
return Error( L"除数不能为0" );
*pResult = n1 / n2;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -