ATL一

1,
#ifdef _ATL_DISABLE_NO_VTABLE
#define ATL_NO_VTABLE
#else
#define ATL_NO_VTABLE __declspec(novtable)
#endif

This form of __declspec can be applied to any class declaration, but should only be applied to pure interface classes, that is, classes that will never be instantiated on their own. The __declspec stops the compiler from generating code to initialize the vfptr in the constructor(s) and destructor of the class. In many cases, this removes the only references to the vtable that are associated with the class and, thus, the linker will remove it. Using this form of __declspec can result in a significant reduction in code size.
__declspec(novtable)最好只用于纯虚接口函数,永远不能对自己实例化。它阻止编译器在类构造和析构的时候初始化虚函数表。通常,在链接的时候会删除虚函数表。这样做可以显著减少代码大小。(总之就是不产生虚函数表,减少运行时间和空间。应为没有虚函数表,不能对虚函数调用,所以这个类不能生在实例。)
If you attempt to instantiate a class marked with novtable and then access a class member, you will receive an access violation (AV).

2,
// CMessageMap - abstract class that provides an interface for message maps
class ATL_NO_VTABLE CMessageMap
{
public:
    virtual BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam,
        LRESULT& lResult, DWORD dwMsgMapID) = 0;
};//消息处理的接口

// CWindowImpl - Implements a window
template <class TBase /* = CWindow */>
class ATL_NO_VTABLE CWindowImplRoot : public TBase, public CMessageMap
{
//消息过滤
}

template <class TBase = CWindow, class TWinTraits = CControlWinTraits>
class ATL_NO_VTABLE CWindowImplBaseT : public CWindowImplRoot< TBase >
{
//创建销毁窗口、设置style、默认消息回调函数
}

template <class T, class TBase /* = CWindow */, class TWinTraits /* = CControlWinTraits */>
class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT< TBase, TWinTraits >
{
//设置窗口属性,创建窗口
};

3,
// CWndClassInfo - Manages Windows class information
#define DECLARE_WND_CLASS(WndClassName) \
static ATL::CWndClassInfo& GetWndClassInfo() \
{ \
    static ATL::CWndClassInfo wc = \
    { \
        { sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS, StartWindowProc, \
         0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \
        NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \
    }; \
    return wc; \
}

// Message map
#define BEGIN_MSG_MAP(theClass) \
public: \
    BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \
    { \
        BOOL bHandled = TRUE; \
        (hWnd); \
        (uMsg); \
        (wParam); \
        (lParam); \
        (lResult); \
        (bHandled); \
        switch(dwMsgMapID) \
        { \
        case 0:

#define MESSAGE_RANGE_HANDLER(msgFirst, msgLast, func) \
    if(uMsg >= msgFirst && uMsg <= msgLast) \
    { \
        bHandled = TRUE; \
        lResult = func(uMsg, wParam, lParam, bHandled); \
        if(bHandled) \
            return TRUE; \
    }

#define END_MSG_MAP() \
            break; \
        default: \
            ATLTRACE(ATL::atlTraceWindowing, 0, _T("Invalid message map ID (%i)\n"), dwMsgMapID); \
            ATLASSERT(FALSE); \
            break; \
        } \
        return FALSE; \
    }

---------------------------------------------------------------------

4,
template< class THost >
class CSingleThreadWindow : public CWindowImpl< CSingleThreadWindow< THost > >
{
public:
    DECLARE_WND_CLASS( _T("SingleThreadWindowClass") )
    BEGIN_MSG_MAP( CSingleThreadProxy< THost > )
        MESSAGE_RANGE_HANDLER(0, 0xFFFFFFFF, WndProc)
    END_MSG_MAP()
    CSingleThreadWindow( THost *pHost ,BOOL bHeap ){}
    RESULT WndProc( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled )
    {
        return m_pHost->OnSingleThreadProxyMsg( uMsg, wParam, lParam, bHandled );
    };
protected:
    THost                *m_pHost;
}

HWND CMulThreadProxy::GetMsgWindow()
{
CSingleThreadWindow<CMulThreadProxy> *pObjWindow = new CSingleThreadWindow<CMulThreadProxy>(this,TRUE);
}

时间: 2025-01-07 14:29:41

ATL一的相关文章

STL,ATL,WTL之间的联系和区别

一.STL即 Standard Template Library (标准模板库) STL是惠普实验室开发的一系列软件的统称.它是由Alexander Stepanov.Meng Lee和David R Musser在惠普实验室工作时所开发出来的.现在虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间.STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模版函数的方式,这相比于

COM组件(ATL篇)

目录 第1章创建进程内组件    1 1.1 目标    1 1.2 创建项目    3 1.2.1 VC++6.0    3 1.2.2 VC++2010    5 1.3 增加COM类    6 1.3.1 VC++6.0    6 1.3.2 VC++2010    8 1.3.3 项目结构    12 1.4 增加方法    13 1.4.1 VC++6.0    13 1.4.2 VC++2010    14 1.5 增加属性    16 1.5.1 VC++6.0    16 1.5

ActiveX控件(ATL篇)

目录 第1章 VC++6.0创建    2 1.1 目标    2 1.2 创建项目    2 1.3 增加COM类    4 1.4 属性    7 1.5 事件    8 1.6 实现连接点    9 1.7 编码    11 1.7.1 增加成员变量    11 1.7.2 初始化成员变量    11 1.7.3 完成属性赋值代码    11 1.7.4 完成控件绘制代码    11 1.7.5 响应鼠标左键按下消息    13 1.7.6 修改DllUnregisterServer   

【转载】COM 组件设计与应用(五)——用 ATL 写第一个组件

原文:http://vckbase.com/index.php/wv/1215.html 一.前言 1.如果你在使用 vc5.0 及以前的版本,请你升级为 vc6.0 或 vc.net 2003: 2.如果你在使用 vc6.0 (ATL 3.0)请阅读本回内容: 3.如果你在使用 vc.net(ATL 7.0)请阅读下回内容:(当然读读本文内容也不错) 4.这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成

【转载】COM 组件设计与应用(六)——用 ATL 写第一个组件

原文:http://vckbase.com/index.php/wv/1216.html 一.前言 1.与 <COM 组件设计与应用(五)>的内容基本一致.但本回讲解的是在 vc.net 2003 下的使用方法,即使你不再使用vc6.0,也请和上一回的内容,参照比对. 2.这第一个组件,除了所有 COM 组件必须的 IUnknown 接口外,我们再实现一个自己定义的接口 IFun,它有两个函数: Add()完成两个数值的加法,Cat()完成两个字符串的连接. 3.下面......好好听讲! 开

ATL CAxWindow类创建问题一则

查看一个浏览器源码实现,发现其中使用了ie的控件,但例子中没有找到任何创建ie浏览器控件的代码,经过仔细跟踪,发现CAxWindow类是可以这么使用滴.. 创建的时候第三个参数直接传入url.调用到CWindowImpl::Create 多次跟踪后发现疑点: 跟踪到这个函数,查看定义,可以看到如下实现,/(ㄒoㄒ)/~~ 也就是说传入得窗口名中如果包含":"就认为是一个URL,并创建WebBrowser控件. 对于这种实现我只能说也是醉了. ? References: Web Appl

ATL常见错误处理

1.VS2008中ATL项目 “对象不支持此属性和方法”问题 参考地址:http://blog.sina.com.cn/s/blog_4dfc39d10100slhx.html

JavaScript与ATL COM返回值问题

最近做了一个基于ATL的控件,设计了一个接口,想返回多个参数,但是通过JavaScript却无法得到返回值,本来以为是自己接口的问题,后来在网上找了很多才发现原来MSDN已经有了明确的说法: JavaScript does not support passing parameters by reference. JavaScript will make copies of these variables and pass them by value when calling methods th

ATL创建COM步骤

1 新建ATL工程,默认选项:动态链接库(DLL) 2 右键单击工程添加一个新的类,ATL-> ATL简单对象 默认下一步完成. 能够看到类视图中出现了刚刚建立的接口. 3 右键单击接口->添加方法 填写方法名和参数属性,下一步完成.注意out必须为指针类型如 int* 是否选择retval 会对返回类型产生影响. 4 在工程中找到这个类 编写方法内容 编译后会自动进行注册. ATL创建COM步骤,布布扣,bubuko.com

【转载】ATL问题集

原文:http://blog.csdn.net/fengrx/article/details/4171629 这些问题是以前在csdn当版主是一些朋友整理的,今天找到了,贴到这里来! #1 如何使用控件不能改变大小? 答:有时我们需要创建不可改变大小的控件,像那种在运行时没有界面的控件(例:时间控件,SysInfo 等),想做到这种功能的话,请把以下代码加入到控件类的构造函数: m_bAutoSize = TRUE; SIZEL size = {24, 24}; AtlPixelToHiMetr