zoukankan      html  css  js  c++  java
  • 使用ATL设计组件(VC6.0)

    使用ATL设计组件(VC6.0)

    fangyukuan

    20071130

    ATLActiveX Tempelate Library使用基于模板的方法充分地对COM进行了支持。通过对ATL所提供的模板的继承,可以直接获得IUnknownIDispatchIClassFactory和组件所需的其他实现,从而通过加入自己所需的各种COM功能的片段来完成组件的设计。

    ATLCOM的支持

    ATLCOM的原始支持是从对Iunknown的支持开始的,如下。创建一个名称为kuan的组件时,由Visual C++ATL向导生成的代码:

    Kuan.h

    // Ckuan

    class ATL_NO_VTABLE Ckuan :

           public CComObjectRootEx<CComSingleThreadModel>,

    public CComCoClass<Ckuan, &CLSID_kuan>,

    public IDispatchImpl<Ikuan, &IID_Ikuan, &LIBID_ATLLib>

    {

    public:

            Ckuan()

            {

            }

     

    DECLARE_REGISTRY_RESOURCEID(IDR_KUAN)

     

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    BEGIN_COM_MAP(Ckuan)

             COM_INTERFACE_ENTRY(Ikuan)

             COM_INTERFACE_ENTRY(IDispatch)

    END_COM_MAP()

    }

     

     

    // Ikuan

    CcomObjectRootEx中实现了对Iunknown的支持

    CcomCoClass中实现了对类工厂的支持,

    IDispatchImpl中实现了对Idispatch的支持。

     

     

    IDL文件。

     

    import "oaidl.idl";

    import "ocidl.idl";

     [

            object,

            uuid(ECD09E84-BE5E-4F5D-AA66-95760E4072F0),

            dual,

            helpstring("Ikuan Interface"),

            pointer_default(unique)

     ]

     interface Ikuan : IDispatch

     {

            [id(1), helpstring("method AddNumbers")] HRESULT AddNumbers(long Num1, long Num2, long *ReturnVal);

     };

     

    [

     uuid(848E12F3-D5C3-469D-8993-1859160117B2),

     version(1.0),

     helpstring("使用ATL设计组件 1.0 Type Library")

    ]

    library ATLLib

    {

     importlib("stdole32.tlb");

     importlib("stdole2.tlb");

     

     [

            uuid(27393093-83B4-41AA-AA2E-B40978F1EC67),

            helpstring("kuan Class")

     ]

     coclass kuan

     {

            [default] interface Ikuan;

     };

    };

     

    使用ATL设计组件的步骤和方法

    以下例子工程名以及路径用中文命名,最好不要这样,由于例子是我几年前开始接触的时候写的,现在就不重新做例子了。

    例:

    1创建一个组件工程。ATL COM AppWizard

    2插入对象。Insert| New ATL Object在弹出的ATL Object Wizard对话框中的Short Name填写kuan

    3在接口中加入方法。

     

    4实现方法:

     

    STDMETHODIMP Ckuan::AddNumbers(long Num1, long Num2, long *ReturnVal)

    {

        // TODO: Add your implementation code here

       *ReturnVal=Num1+Num2;

        return S_OK;

    }

    5.Tools|RegisterControl选项,注册该组件。

     

     

    6编写一个测试程序:

    #include<iostream.h>

    #include "..\使用ATL设计组件\使用ATL设计组件.h"

    #include "..\使用ATL设计组件\使用ATL设计组件_i.c"

     

    void main(void)

    {

        //声明HRESULTIkuan接口指针

        Ikuan * IkuanATL = NULL;

     

        HRESULT hr = CoInitialize(NULL);   //初始化COM

     

        //使用SUCCEEDED宏并检查我们是否能得到一个接口指针

        if(SUCCEEDED(hr))

        {

           hr = CoCreateInstance(CLSID_kuan,

               NULL,

               CLSCTX_INPROC_SERVER,

               IID_Ikuan,

               (void **)&IkuanATL);

           //如果成功,则调用AddNumbers方法,否则显示相应的出错信息

           if(SUCCEEDED(hr))

           {

               long ReturnValue;

               IkuanATL->AddNumbers(8,9,&ReturnValue);

               cout << "The answer for 8+9 is:" << ReturnValue << endl;

               IkuanATL->Release();

           }

           else

           {

               cout << "CoCreateInstance Failed." << endl;

           }

        }

        CoUninitialize();//释放COM

    }

     本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/04/09/1708633.html

     

  • 相关阅读:
    ConcurrentHashMap 内部实现分析
    死锁的产生条件和预防处理
    UVA 11080
    【Gapps】安装GooglePlay引发一系列问题
    HDU4876ZCC loves cards(多校题)
    HDU 3699 A hard Aoshu Problem (暴力搜索)
    coreos docker 尝新奇
    Android 检測网络是否连接
    html练习(5)
    散文说python半篇——景观三元论与盖茨比的对话
  • 原文地址:https://www.cnblogs.com/fangyukuan/p/1708633.html
Copyright © 2011-2022 走看看