使用ATL设计组件(VC6.0)
fangyukuan
2007年11月30日
ATL(ActiveX Tempelate Library)使用基于模板的方法充分地对COM进行了支持。通过对ATL所提供的模板的继承,可以直接获得IUnknown、IDispatch、IClassFactory和组件所需的其他实现,从而通过加入自己所需的各种COM功能的片段来完成组件的设计。
ATL对COM的支持
ATL对COM的原始支持是从对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)
{
//声明HRESULT和Ikuan接口指针
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
}