zoukankan      html  css  js  c++  java
  • 深入解析ATL 笔记1 添加一个simple object时做了什么

    在图书馆拿到这本不错的书,英文名为“ATL Internals”,第二版,用的是VC2005和ATL8。作者都是很牛的,决定好好看一下,补充一下ATL, COM的知识。一边看一遍记笔记,。。恩。。

    首先新建一个ATL dll 工程,添加一个ATL Simple Object, 设置用default,然后用winmerge看看多了什么东西 .

    添加的文件:

    SimpleObj2.cpp

    SimpleObj2.h

    SimpleObj2.rgs

    修改的文件:

    atlDemo.idl
    atlDemo.rc
    atlDemo.vcproj
    resource.h


    先看看修改的文件,主要是idl

     1[
     2    object,
     3    uuid(66B9309A-2907-44CD-8DE9-0B5D774147DD),
     4    dual,
     5    nonextensible,
     6    helpstring("ISimpleObj2 Interface"),
     7    pointer_default(unique)
     8]
     9interface ISimpleObj2 : IDispatch{
    10};

    以及在library atlDemoLib下面添加的

     1[
     2        uuid(24A41D8D-5367-4C6B-A7D3-3930361A7387),
     3        helpstring("_ISimpleObj2Events Interface")
     4    ]
     5    dispinterface _ISimpleObj2Events
     6    {
     7        properties:
     8        methods:
     9    };
    10    [
    11        uuid(220C4A97-B240-4443-BEE9-73D15D66B92D),
    12        helpstring("SimpleObj2 Class")
    13    ]
    14    coclass SimpleObj2
    15    {
    16        [default] interface ISimpleObj2;
    17        [default, source] dispinterface _ISimpleObj2Events;

    18    };

     多了的文件内容

    _ISimpleObj2Events_CP.h:

    1#pragma once
    2
    3template <class T>
    4class CProxy_ISimpleObj2Events : public IConnectionPointImpl<T, &__uuidof( _ISimpleObj2Events ), CComDynamicUnkArray>
    5{
    6    //Warning this class will  be regenerated by the wizard.
    7public:
    8}
    ;
    9

     SimpleObj2.cpp:

    1// SimpleObj2.cpp : Implementation of CSimpleObj2
    2
    3#include "stdafx.h"
    4#include "SimpleObj2.h"
    5
    6
    7// CSimpleObj2
    8
    9

    SimpleObj2.h

     1// SimpleObj2.h : Declaration of the CSimpleObj2
     2
     3#pragma once
     4#include "resource.h"       // main symbols
     5
     6#include "atlDemo_i.h"
     7#include "_ISimpleObj2Events_CP.h"
     8
     9
    10#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
    11#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
    12#endif
    13
    14
    15
    16// CSimpleObj2
    17
    18class ATL_NO_VTABLE CSimpleObj2 :
    19    public CComObjectRootEx<CComSingleThreadModel>,
    20    public CComCoClass<CSimpleObj2, &CLSID_SimpleObj2>,
    21    public IConnectionPointContainerImpl<CSimpleObj2>,
    22    public CProxy_ISimpleObj2Events<CSimpleObj2>,
    23    public IDispatchImpl<ISimpleObj2, &IID_ISimpleObj2, &LIBID_atlDemoLib, /*wMajor =*/ 1/*wMinor =*/ 0>
    24{
    25public:
    26    CSimpleObj2()
    27    {
    28    }

    29
    30DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLEOBJ2)
    31
    32
    33BEGIN_COM_MAP(CSimpleObj2)
    34    COM_INTERFACE_ENTRY(ISimpleObj2)
    35    COM_INTERFACE_ENTRY(IDispatch)
    36    COM_INTERFACE_ENTRY(IConnectionPointContainer)
    37END_COM_MAP()
    38
    39BEGIN_CONNECTION_POINT_MAP(CSimpleObj2)
    40    CONNECTION_POINT_ENTRY(__uuidof(_ISimpleObj2Events))
    41END_CONNECTION_POINT_MAP()
    42
    43
    44    DECLARE_PROTECT_FINAL_CONSTRUCT()
    45
    46    HRESULT FinalConstruct()
    47    {
    48        return S_OK;
    49    }

    50
    51    void FinalRelease()
    52    {
    53    }

    54
    55public:
    56
    57}
    ;
    58
    59OBJECT_ENTRY_AUTO(__uuidof(SimpleObj2), CSimpleObj2)
    60

     SimpleObj2.rgs

     1HKCR
     2{
     3    atlDemo.SimpleObj2.1 = s 'SimpleObj2 Class'
     4    {
     5        CLSID = s '{220C4A97-B240-4443-BEE9-73D15D66B92D}'
     6    }

     7    atlDemo.SimpleObj2 = s 'SimpleObj2 Class'
     8    {
     9        CLSID = s '{220C4A97-B240-4443-BEE9-73D15D66B92D}'
    10        CurVer = s 'atlDemo.SimpleObj2.1'
    11    }

    12    NoRemove CLSID
    13    {
    14        ForceRemove {220C4A97-B240-4443-BEE9-73D15D66B92D} = s 'SimpleObj2 Class'
    15        {
    16            ProgID = s 'atlDemo.SimpleObj2.1'
    17            VersionIndependentProgID = s 'atlDemo.SimpleObj2'
    18            ForceRemove 'Programmable'
    19            InprocServer32 = s '%MODULE%'
    20            {
    21                val ThreadingModel = s 'Apartment'
    22            }

    23            'TypeLib' = s '{CFE54601-E42B-4851-8A14-D259630A8648}'
    24        }

    25    }

    26}

    27

     添加一个叫TestXXX地方法之后,多了这些东东

     1
     2interface IMySimpleObj : IDispatch{
     3    [id(1), helpstring("method Test")] HRESULT TestXXX(void);
     4}
    ;
     5
     6
     7STDMETHODIMP CMySimpleObj::TestXXX(BSTR str)
     8{
     9    // TODO: Add your implementation code here
    10
    11    return S_OK;
    12}

    13
    14
    15class ATL_NO_VTABLE CMySimpleObj :
    16    public CComObjectRootEx<CComSingleThreadModel>,
    17    public CComCoClass<CMySimpleObj, &CLSID_MySimpleObj>,
    18    public IDispatchImpl<IMySimpleObj, &IID_IMySimpleObj, &LIBID_atlDemoLib, /*wMajor =*/ 1/*wMinor =*/ 0>
    19{
    20    STDMETHOD(TestXXX)(BSTR str);

     添加一个叫MyProperty的属性后,多了这些

     1
     2interface IMySimpleObj : IDispatch{
     3    [propget, id(4), helpstring("property MyProperty")] HRESULT MyProperty([out, retval] BSTR* pVal);
     4    [propput, id(4), helpstring("property MyProperty")] HRESULT MyProperty([in] BSTR newVal);
     5}
    ;
     6
     7
     8STDMETHODIMP CMySimpleObj::get_MyProperty(BSTR* pVal)
     9{
    10    // TODO: Add your implementation code here
    11
    12    return S_OK;
    13}

    14
    15STDMETHODIMP CMySimpleObj::put_MyProperty(BSTR newVal)
    16{
    17    // TODO: Add your implementation code here
    18
    19    return S_OK;
    20}

    21
    22
    23class ATL_NO_VTABLE CMySimpleObj {
    24    STDMETHOD(get_MyProperty)(BSTR* pVal);
    25    STDMETHOD(put_MyProperty)(BSTR newVal);

  • 相关阅读:
    Atitit 人脸识别 眼睛形态 attilax总结
    Atitit 手机号码选号 规范 流程 attilax总结 v2 r99.docx
    atitit 板块分类 上市公司 龙头企业公司 列表 attilax总结.docx
    Atititi atiitt eam pam资产管理 购物表去年.xlsx
    使用cmd查看电脑连接过的wifi密码(一)
    常见十大web攻击手段 悟寰轩
    常见web攻击方式 悟寰轩
    【MYSQL数据库】MYSQL学习笔记mysql分区基本操作 悟寰轩
    Filter及FilterChain的使用详解 悟寰轩
    启动tomcat spring初始化两次问题(eg:@PostConstruct) 悟寰轩
  • 原文地址:https://www.cnblogs.com/cutepig/p/1433535.html
Copyright © 2011-2022 走看看