fangyukuan

永无止境的追求...追求卓越!!!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

使用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

 

posted on 2010-04-09 21:51  fangyukuan  阅读(4303)  评论(0编辑  收藏  举报