课程的大体目录:
3.Com开发之第一个ATL程序
4.Com开发之MFC调用Com接口
5.Com开发之MFC调用Com接口
6.Com开发之MFC调用Com接口
7.Com开发之MFC调用Com接口
8.Com开发之MFC调用Com接口
9.Com开发之ATL框架详解
10.Com开发之MFC实现自动化组件
11.Com开发之脚本调用Com的双接口
12.Com开发之MFC调用IDispatch
13.Com开发之MFC调用IDispatch
14.Com开发之MFC包装类的使用
15.Com开发之错误信息处理
16.Com开发之错误信息处理
17.Com开发之错误信息处理
18.Com开发之回调事件通知
19.Com开发之回调事件通知
20.Com开发之连接点
21.Com开发之连接点
24.VB测试ADO部件
25.VB测试ADO对象
26.VC使用ADO访问数据库
27.数据库建模工具的使用
28.ADO点Net测试SQL2005数据库设计
29.ADO点Net测试SQL2005数据库设计
30.ADO点Net测试SQL2005数据库设计
31.ADO点Net测试SQL2005数据库设计
32.C++点Net基础应用视频
33.C++点Net基础应用视频
34.第一个ATLCOM编程
35.第一个ATLCOM编程
36.第一个自定义ActiveX控件
37.第一个自定义ActiveX控件
项目源代码:


贴一下
// Err.cpp : Implementation of CErr
#include "stdafx.h"
#include "FirstATL.h"
#include "Err.h"


/////////////////////////////////////////////////////////////////////////////
// CErr


STDMETHODIMP CErr::InterfaceSupportsErrorInfo(REFIID riid)
{
        static const IID* arr[] =
        {
                &IID_IErr
        };
        for (int i=0; i < sizeof(arr) / sizeof(arr[0]); i++)
        {
                if (InlineIsEqualGUID(*arr,riid))
                        return S_OK;
        }
        return S_FALSE;
}




// 最简单形式的错误表现方式
STDMETHODIMP CErr::Div1(long n1, long n2, long *pResult)
{
        // TODO: Add your implementation code here
        if (0==n2)
                return E_INVALIDARG;
        *pResult = n1 / n2;
        return S_OK;
}


// 使用 IErrorInfo 接口方式的原理性代码
STDMETHODIMP CErr::Div2(long n1, long n2, long *pResult)
{
        // TODO: Add your implementation code here
        if (n2)
        {
                *pResult = n1 / n2;
                return S_OK;
        }
        HRESULT hr;
        CComQIPtr < ICreateErrorInfo > spCEI;
        hr = ::CreateErrorInfo(&spCEI);
        if (!spCEI)
                return E_FAIL;


        spCEI->SetGUID(IID_IErr);  // 如果是系统定义的错误也可以使用 GUID_NULL
        LPOLESTR pProgID = NULL;
        hr = ::ProgIDFromCLSID(CLSID_Err,&pProgID);
        if (SUCCEEDED(hr) && pProgID)
        {
                spCEI->SetSource(pProgID); // 设置错误源,也就是组件的 ProgID
                ::CoTaskMemFree(pProgID);
        }
        // 上面是通用的方法,其实你当然知道正在书写的组件的 ProgID 了
        // 所以不用动态取得 ProgID 也可. 你可以这样书写
        // spCEI->SetSource( L&quot;FirstATL.Err.1&quot; ); ProgID 可以在 rgs 文件中看到
        // 如果你的组件同时提供了帮助文件,那么就可以:
        //        spCEI->SetHelpContext( 0 );                        // 设置帮助文件中的主题号
    //        spCEI->SetHelpFile( L&quot;xxx.hlp&quot; );        // 设置帮助文件的文件名
        spCEI->SetDescription( L&quot;除数不能为0&quot; );        // 设置错误的文字描述
        CComQIPtr < IErrorInfo > spErrInfo = spCEI;        // QueryInterface 得到 IErrorInfo
        if( spErrInfo )
                ::SetErrorInfo( 0, spErrInfo );                // 这时调用者就可以得到错误信息了


        return E_FAIL;
}


// 使用 CComCoClass::Error() 方式,便捷地设置错误信息
STDMETHODIMP CErr::Div3(long n1, long n2, long *pResult)
{
        // TODO: Add your implementation code here
        if (0==n2)
                return Error(L&quot;除数不能为0&quot;);
        *pResult = n1 / n2;
        return S_OK;
}
解压密码:www.lthack.com
下载地址:
查看当前『隐藏内容』需花费 60资源豆,【支付查看