ATL学习之MSDN实例制作!

来源:互联网 发布:linux编译内核步骤 编辑:程序博客网 时间:2024/06/12 22:03

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