ATL(Active Template Library)动态模板库,是一个类库,可以使用它进行COM开发。本文通过一个基础入门的例子,简要介绍如何定义、实现COM接口,前台如何调用COM接口。
先看例子最终效果:
一、新建项目:
向导完成后,生成的工程源码如下:
二、添加一个ATL对象:AtlDemoIf
添加ATL对象后新增的文件如下:
三、AtlDemoIf对象中添加接口方法:ConcatStr,并定义接口参数
这时,AtlDemo.idl文件中新增了一个接口:
interface IAtlDemoIf : IDispatch{
[id(1)] HRESULT ConcatStr([in] BSTR* pStr1, [in] BSTR* pStr2, [out,retval] BSTR* pRetStr);
};
AtlDemoIf.h中新增了一个公开成员函数:
STDMETHOD(ConcatStr)(BSTR* pStr1, BSTR* pStr2, BSTR* pRetStr);
AtlDemoIf.cpp中新增了函数体:
STDMETHODIMP CAtlDemoIf::ConcatStr(BSTR* pStr1, BSTR* pStr2, BSTR* pRetStr)
{
CString retStr;
retStr.Format(_T("%s%s"), *pStr1, *pStr2);
*pRetStr = retStr.AllocSysString();
return S_OK;
}
四、写一个简单的html网页进行测试:
<HTML>
<HEAD>
<TITLE>COM接口测试页</TITLE>
<script type="text/javascript">
function Test(){
var retStr = AtlDemoObj.ConcatStr(document.all.ipt1.value, document.all.ipt2.value);
alert(retStr);
}
</script>
</HEAD>
<BODY>
<object id="AtlDemoObj" classid="clsid:B0DA2962-C4C3-48CD-BFBC-4F43F9D03C56" width=0 height=0></object>
<input name=ipt1 size=8/> <input name=ipt2 size=8/> <input type="button" value="Test" onclick = "javascript:Test();"/>
</BODY>
</HTML>
注意:clsid使用AtlDemo.idl中importlib下面的uuid,如图:工程编译后会自动注册COM,没有注册的可使用命令regsvr32 xxx.dll注册,如图:
这时注册表(regedit)中会写入相应的数据:
这时,只能使用IE浏览器打开网页测试,因为只有IE支持COM组件调用,其他内核的浏览器想要实现类似功能可以使用npapi,详细请参考《使用NPA ??件的源码实例》。
源码点此下载,如有问题请点此。