开始
第一步 新建一个ATL项目
“文件”-> “新建”-> “项目”,打开“新建项目”对话框,展开Visual C++,选择ATL,在右边的模板中,选择“ATL项目”,确定项目名称“TestATLCom”
在应用程序设置向导中,请选择默认值。
第二步 在项目中创建一个简单的ATL对象
右击项目“TestATLCom”,打开右键菜单,选择“添加”->“类…”,打开“添加类”对话框,在左边“类别”选择“ATL”项,然后在右边“模板”中选择“ATL 简单对象”。添加后,进入“ATL 简单对象向导”
上图中,在“简称”处输入“MyCom”,其余的输入框内容会自动生成。下一步。
上图中,我要解释一下:
a) 首先,线程模型,此处我选择“单元”(Apartment),该值是默认的。
b) 第二,接口,此处有两个选项“双重”和“自定义”,我选择“双重”(使用双重接口的好处就是在脚本语言Javascript中也可使用该ATL对象)
c) 第三,聚合,作为一项ATL的高级功能,此处不作说明。
d) 再看“ISupportErrorInfo”,如果选择它,则可支持向使用这个ATL对象的客户端发送详细的错误信息。此处,我没有选择。
e) 最后,为了能从组件中调用事件,你要选择“连接点”
f) 点击“完成”,生成一个ATL对象。
完成第二步时,Visual Studio 会在项目中添加_IMyComEvents_CP.h、MyCom.h、MyCom.cpp三个文件,并在TestATLCom.idl ,添加了IMyCom 接口的定义信息。
备注:
*.idl 文件,作为接口定义语言文件,描述了ATL对象的接口。
第三步 为刚才建立的MyCom的接口IMyCom 添加方法和属性
打开“类视图”,选择“IMyCom”,右击打开右键菜单,展开“添加”,“添加”的子菜单有两项,分别是“添加方法(M)…”和“添加属性(T)…”。选择“添加方法(M)…”打开如下一个对话框
此处,我添加了一个“Add”方法,并且为了设置了3个参数,点击完成后,在*.idl文件中的IMyCom接口中定义了如下一个方法:
[id(2), helpstring("方法Add")] HRESULT Add([in] LONG var1, [in] LONG var2, [out,retval] LONG* returnVal);
在MyCom.h 文件中添加了如下内容:
STDMETHOD(Add)(LONG var1, LONG var2, LONG* returnVal);
在MyCom.CPP 文件中添加了方法Add的定义:
STDMETHODIMP CMyCom::Add(LONG var1, LONG var2, LONG* returnVal)
{
// TODO: 在此添加实现代码
*returnVal = var1 + var2; // 此处的代码是我之后加上去的
return S_OK;
}
编译通过。
第四步 为了验证刚才的ATL项目是有效的,则建立一个测试项目
建立一个MFC对话框
包含
#include "/TestATLCom.h"
#include "/TestATLCom_i.c"
其他就跟加载COM一样的
::CoInitialize(NULL);
IMyCom *pFun = NULL;
HRESULT hr = ::CoCreateInstance(CLSID_MyCom,NULL,CLSCTX_INPROC,IID_IMyCom,(LPVOID*)&pFun);
long m_add=0;
if(SUCCEEDED(hr))
{
hr = pFun->Add1(1,2,&m_add);
if(FAILED(hr))
{
MessageBox(_T("操作组件失败!"),0,0);
}
}
CString buff;
buff.Format(_T("%ld"),m_add);
MessageBox(buff);
if(pFun)
pFun->Release();
::CoUninitialize();
UpdateData(0);
完毕!!!