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

来源:互联网 发布:sql高级统计查询语句 编辑:程序博客网 时间:2024/05/22 03:49


使用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实现方法:

 

STDMETHODIMPCkuan::AddNumbers(longNum1, 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"

 

voidmain(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

0 0