ATL学习之MSDN实例制作!

本文介绍了如何使用ATL创建一个COM控件项目,包括DllCanUnloadNow、DllGetClassObject等核心函数。通过向导添加ATL控件并设置连接点,展示了编译器自动生成的接口映射、属性映射和连接点映射代码,揭示了ATL模板技术在实现COM组件中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.新建以个ATL项目的工程:

        工程建立之后,自动产生了相应的框架代码。

框架为我们主要生成了以下代码,引出了四个函数:

TDAPI DllCanUnloadNow(void)
{
    return _AtlModule.DllCanUnloadNow();
}


// 返回一个类工厂以创建所请求类型的对象
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    return _AtlModule.DllGetClassObject(rclsid, riid, ppv);
}


// DllRegisterServer - 将项添加到系统注册表
STDAPI DllRegisterServer(void)
{
    // 注册对象、类型库和类型库中的所有接口
    HRESULT hr = _AtlModule.DllRegisterServer();
 return hr;
}


// DllUnregisterServer - 将项从系统注册表中移除
STDAPI DllUnregisterServer(void)
{
 HRESULT hr = _AtlModule.DllUnregisterServer();
 return hr;
}

也就是COM中几个必须的函数!

 

2.单击项目->添加类->ATL控件

设置为可插入,支持连接点,加入一些常用的属性

经过这个向导的设置,编译器为我们生成很多必要的代码,主要通过模板技术,生成了很多必要的代码

比如说连接点,

她通过 从这个模板类 IConnectionPointContainerImp<MyCtl> 派生,从而实现了管理连接点的接口!!!!

我们从起生成的框架代码中可以看出一些门道来!

首先是这个宏,很像MFC中的消息映射宏!

BEGIN_COM_MAP

应该是加入了一个接口映射表

COM_INTERFACE_ENTRY加入接口虚表指针!!!(不太确定! ^_^)

以后有空得慢慢研究一番!

BEGIN_COM_MAP(CPolyCtl3)
 COM_INTERFACE_ENTRY(IPolyCtl3)
 COM_INTERFACE_ENTRY(IDispatch)
 COM_INTERFACE_ENTRY(IViewObjectEx)
 COM_INTERFACE_ENTRY(IViewObject2)
......................

.......
 COM_INTERFACE_ENTRY(IDataObject)
#endif
 COM_INTERFACE_ENTRY(IProvideClassInfo)
 COM_INTERFACE_ENTRY(IProvideClassInfo2)
#ifdef _WIN32_WCE // 要在 Windows CE 上正确加载该控件,要求 IObjectSafety
 COM_INTERFACE_ENTRY_IID(IID_IObjectSafety, IObjectSafety)
#endif
END_COM_MAP()

然后是这个宏:

BEGIN_PROP_MAP(CPolyCtl3)
 PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
 PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
 PROP_ENTRY("Sides", 1, CLSID_PolyProp)

#ifndef _WIN32_WCE
 PROP_ENTRY("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage)
#endif
 // 示例项
 // PROP_ENTRY("Property Description", dispid, clsid)
 // PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()

//具体作用尚不大清楚!

 

支持连接点的宏!

加入连接点接口的虚表指针!??

BEGIN_CONNECTION_POINT_MAP(CPolyCtl3)
 CONNECTION_POINT_ENTRY(__uuidof(_IPolyCtl3Events))
END_CONNECTION_POINT_MAP()

 

消息映射宏:

BEGIN_MSG_MAP(CPolyCtl3)
 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown)
 CHAIN_MSG_MAP(CComControl<CPolyCtl3>)
 DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值