• ATL 创COM物


    我原来以前写dll创建过程,而直接使用LoadLibrary加载动态库。

    但ATL提出了一个非常重要的特点是引入COM对象的概念。

    首先。 ATL active template library该活动模板库。ATL至asp提供代码COM应用。

    而一般使用活动模版库来创建COM组件。简单来说ATL一般作为方便快捷的COM开发工具使用。

    而ATL中使用的基本技术为 COM技术。C++模版技术和C++多继承技术。

    接下来是使用ATL开发一个COM组件的基本过程。附带截图:

    1.新建一个ATL项目:


    随便取个名字,然后确定。


    设置向导里直接选完毕,这里就是简单的创建一个dll文件。

    2. 然后是在项目中选择加入一个新的类:


    新类选择为ATL中的ATL简单对象:



    3.在向导中加入类名:


    会发现。向导会自己主动生成其它信息,如类名。组件类名。接口名等。

    在选项中还有更详细的一些设置:


    直接点完毕。

    4.在类视图中,我们看到有生成的Cfirst类和Ifirst 接口。


    在接口上加入方法。会有下面具体的信息:


    填上方法名,然后加入參数。com函数的返回值都是用来检測dll函数是否正确载入并执行的。所以要使用參数作为返回值来传递。这里实现一个简单的加法函数。对于这个函数,其參数为 A,B,和Ret。ret是一个long* 。用来储存返回值。

    点in。说明这个參数是是输入的參数。在生成的代码处会自己主动加入_in_ ,提示这里是输入的參数,但没有太大的实际作用。在參数类型中寻找相应的数据类型,并填上相应的參数名:


    对于函数没有返回值的话,通常会将最后一个參数设置为指针类型。用其记录函数返回值:


    最后的參数为:


    点完毕。


    5.改动生成的代码。加入实现。

    首先我们双击接口,会进入一个MyFirstDll.idl 的文件里,当中有下面代码:

    interface Ifirst : IUnknown{
    	[] HRESULT Add([in] LONG A, [in] LONG B, [out,retval] LONG* Ret);
    };
    [
    	uuid(F7DAFD6A-C1DB-46AF-9CF9-62EC0D7D589F),
    	version(1.0),
    ]
    library MyFirstDllLib
    {
    	importlib("stdole2.tlb");
    	[
    		uuid(D2F7F834-D4A2-4AB7-B5BE-B08D1EB35564)		
    	]
    	coclass first
    	{
    		[default] interface Ifirst;
    	};
    };
    是供其它语言或系统中使用的接口。

    这里的IUnknown也是值得注意的地方,在COM的内部实现中。全部的类的是继承与这个IUnKnown基类。

    对于ATL COM中的一些更加深入的细节。包含:(IUnKnown三个函数,另外两个类CComCoClass . CComObjectRootEx 。DLL的注冊与反注冊。对象的析构函数以及内存申请与释放。首先 com对象中使用new或 CoTaskMemAlloc申请内存都能够,前者是内部自己使用。自己释放。后者可能申请的内存给对方使用,所以对方能够同过相应的方法来释放内存。)这些内容以后有空再更加具体的去学习吧,先挖个坑。以后有空再填。



    然后看 first.h。 头文件里关于Cfirst类的声明例如以下:

    class ATL_NO_VTABLE Cfirst :
    	public CComObjectRootEx<CComSingleThreadModel>,
    	public CComCoClass<Cfirst, &CLSID_first>,
    	public Ifirst
    {
    public:
    	Cfirst()
    	{
    	}
    
    DECLARE_REGISTRY_RESOURCEID(IDR_FIRST)
    
    DECLARE_NOT_AGGREGATABLE(Cfirst)
    
    BEGIN_COM_MAP(Cfirst)
    	COM_INTERFACE_ENTRY(Ifirst)
    END_COM_MAP()
    
    
    
    	DECLARE_PROTECT_FINAL_CONSTRUCT()
    
    	HRESULT FinalConstruct()
    	{
    		return S_OK;
    	}
    
    	void FinalRelease()
    	{
    	}
    
    public:
    
    
    
    	STDMETHOD(Add)(LONG A, LONG B, LONG* Ret);
    };
    这里就体现了ATL的基本技术,多继承以及模版。继承 的 内容 有一个 Ifirst , 为之前在idl文件里的接口。在编译器中,对于这个Ifirst接口直接是红下划线表示错误,说明事实上现是一个动态的过程,至于详细是怎样的。我就不想太深入了解了。

    这个类声明中有很多复杂的宏的使用。这不是重点,重点是public 中的add函数声明。

    然后我们进入 Cfirst.cpp中。在add函数中加上简单的实现:

    STDMETHODIMP Cfirst::Add(LONG A, LONG B, LONG* Ret)
    {
    	// TODO: 在此加入实现代码
    	*Ret = A+B;
    	return S_OK;
    }
    
    这样就实现了一个简单的COM组件。


    6. 点生成,生成dll。

    之后是转让COM物。


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    Activiti流程实例
    Activiti使用步骤 (IDEA)
    工作流简介
    并发编程常见面试题
    navicat自动备份数据,可实现每天定时备份
    MySQL, SQLite 和 PostgreSQL 关于information_schema 的一些查询(表结构,表信息,库信息....)
    GIS相关网站下载全国的GeoJSON格式数据可以到区县级数据
    GIS当中使用uDig打开shp图层,并查看数据结果
    解决Failed to execute goal org.apache.maven.plugins 错误,JDK版本不一致
    Maven插件maven-assembly-plugin进行打包部署
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4855951.html
Copyright © 2020-2023  润新知