atl

vs2010 用ATL创建com组件

*爱你&永不变心* 提交于 2019-12-07 11:09:52
使用vs2010创建ATL项目可以自动完成复杂的com组建编写 用ATL生成com组件的步骤: 1,新建一个ATL项目,选择dll,其他默认参数即可 2,在类视图中,右击项目,添加一个类,在向导中填写类的名称,如,testClass。注意参考注意事项的第一条。此时看到多了一个ItestClass的条目。 3,右击ItestClass条目,添加一个方法,如add,设置参数,勾选in表示输入,勾选out和retval表示外界调用时返回的参数(ATL中的函数实际的返回值都是S_OK) 4,在解决方案资源管理器中,右击testClass.cpp,在其中补全add函数即可 参考链接: http://www.cnblogs.com/xiaokang088/archive/2011/05/16/2047376.html 注意事项: 一:在添加类的时候,有个ProgID,如图,这个属性实际上必填的,但是在vs2008之前这个值都是自动填上的,但是在vs2010里这个值需要手动添加,否则生成的dll文件,虽然可以在vs2010中开发的程序中调用,但是在其他程序中如PHP中则会出错(如:PHP的“unable to create object,无效语法”,或者无法注册控件等)。ProgID的值可以参考,vs2008之前的形式:projectname.classname的形式命名。 二:

ATL中的窗口类及常见的窗口处理情况

十年热恋 提交于 2019-12-07 11:09:30
ATL 中的窗口类及常见的窗口处理情况 1 、 ATL 中的窗口类( CWindow ): CWindow类作为ATL中的窗口类,它主要实现了对窗口进行管理和操作的基本功能;它提供的很多方法都是对Win32 API函数的简单封装。 在实际的应用中,我们可以根据自己的需要,合理的使用CWindow类的子类CWindowImpl、CContainedWindow、CDialogImpl,etc来简化操作。 其各类的功能如下: CWindow类:允许你通过窗口的句柄为其指定一个CWindow对象,并通过CWindow类的方法来管理该窗口。 CWindowImpl类:允许你创建一个新的窗口或者为存在的窗口创建一个子窗口,并将消息的处理放在消息链中进行。 CContainedWindow类:包容器窗口,你也可以用它创建一个新的窗口或为存在的窗口创建一个子窗口;它作为CWindow与CWindowImpl的一个折中,允许你将窗口的消息处理集中到父窗口中。 CDialogImpl类:允许你创建一个有模式或无模式对话框,并将消息的处理放在消息链中进行。 CAxDialogImpl:允许你为Active X控件创建一个有模式或无模式对话框。 其它的还有CWndClassInfo、CWinTraits,CWinTraitsOR,其各个类的具体使用,及它们提供的方法祥见MSDN。 2

VS2010 简单ATL COM开发(上)

一世执手 提交于 2019-12-07 11:09:05
1、 打开VS2010,新建ATL COM 项目,步骤:“文件” --》“新建” --》“项目”,选择“Visual C++” --》“ATL 项目” ,填写“名称” FirstCOM --》“确定”。 2、ATL 项目向导, 勾选 【支持COM+ 1.0】和【支持部件注册器】,其他默认,点击完成。 3、切换到类视图,右键单击项目“FirstCOM”--》“添加” --》“类”。 4、 选“ATL” --》“ATL 简单对象” --》“添加”。 5、ATL 简单对象向导,“ 简称”中输入类名称FirstClass,其他输入框会自动填写, 最下面的“ProgID”没有自动填写,最好自己写上一个,如FirstCOM.math,否则后面无法正确调用组件 ,点击“完成”。如果出现提示【是否覆盖现有文件】,点击【是】即可。 6、 切换到类视图,选中刚才添加的接口IFirstClass,如下,然后右键单击【添加】添加方法。 7、添加方法向导,在"方法名" 下输入Add。增加两个输入参数:勾选【in】,选择参数类型LONG,输入参数名para1,点击“添加”。同样操作增加参数para2。然后增加一个返回参数:先选择参数类型LONG*,再勾选【retval】,输入参数名result,点击添加。 点击“完成”即可,如果点击下一步,不需要填写信息,点击“完成”即可。 8、 切换到解决方案资源管理器

ATL中的CWindowImpl模板类

感情迁移 提交于 2019-12-07 11:08:47
首先看一下这个模板类的声明 template < class T, class TBase = CWindow, class TWinTraits = CControlWinTraits> class CWindowImpl; 从声明中可以看出,有两个默认参数。 TBase是默认的窗口基类,这个CWindow简单封装了HWND,并且封装了几乎所有的Use32 APIs中以HWND为第一个参数的接口。CWindow提供一个共有的成员m_hWnd,可以直接处理HWND,也提供了一个operator HWND(),可以直接是CWindow作为需要HWND对象的函数参数。CWindow不同于MFC中的 CWnd。CWindow易于创建的,它不提供像MFC中的HWND到CWnd的对象关系。当CWindow对象超出作用域时,它被销毁,但是它关联的实际窗口不会被销毁。因此不需要detach你创建的临时的CWindow对象。 TWinTraits 是默认的窗口特征。 接下来,看一下它的定义的代码: template < class T, class TBase /* = CWindow */ , class TWinTraits /* = CControlWinTraits */ > class ATL_NO_VTABLE CWindowImpl : public CWindowImplBaseT

Shall we treat BSTR type in COM as value or reference?

家住魔仙堡 提交于 2019-12-07 05:26:54
问题 From book ATL Internals , I knew BSTR is different from OLECHAR*, and there are CComBSTR and CString for BSTR. According MSDN Allocating and Releasing Memory for a BSTR, I knew memory management responsibility for caller/callee. Take this line from MSDN, HRESULT CMyWebBrowser::put_StatusText(BSTR bstr) I still do not know how to handle bstr properly in my implementation. Since I still have a basic question for BSTR -- should we treat bstr as a value (like int) or as a reference (like int*),

Cannot Open File atls.lib

て烟熏妆下的殇ゞ 提交于 2019-12-07 04:56:42
问题 I have atls.lib in my hard drive, but I can't link it into my Visual Studio project. I know that atls.lib is an ATL specific library file, and I have all the ATL files/headers/libraries. However, I still can't link them. LINK : fatal error LNK1104: cannot open file 'atls.lib' Can anyone help a helpless programmer? Thank you very much. 回答1: It seems that the library directory has not been added. In Project Properties, Linker, General options, add the directory where atls.lib resides to the

VS2012创建ATL工程及使用MFC测试COM组件

大兔子大兔子 提交于 2019-12-07 04:41:19
一、创建ATL工程 1、创建ATL项目,取名为MyATL 2、在 ATL 项目向导中,勾选【支持 MFC 】(利用 MFC 测试用)、【支持 COM+ 1.0 】和【支持部件注册器】,其余的选项默认,点击完成。 3、右键工程名称,选择添加类,接下来选择【 ATL 简单对象】。 4、在【 ATL 简单对象向导】对话框中填入下面内容(可更改为自己喜欢的类名称),然后直接点击完成。 5、切换到类视图,为刚刚添加的接口 IMyATLClass 添加方法。 6、现在来添加 2 个方法,分别用来计算两个数之和和弹出 MFC 对话框。 7、切换到【解决方案资源管理器】,可以看到 Sum 和 PopupDialog 的定义。 interface IMyATLClass : IDispatch{ [id(1)] HRESULT Sum([in] LONG para1, [in] LONG para2, [in] LONG* sum); [id(2)] HRESULT PopupDialog([in] CHAR* text); }; 将参数[ in ] LONG* sum修改为[ out ] LONG* sum,表示这是一个需要输出的值。 8、打开MyATLClass.cpp,实现添加的两个方法。 STDMETHODIMP CMyATLClass::Sum(LONG para1, LONG para2

16.MFC实现IDispatch自动化接口

喜欢而已 提交于 2019-12-07 04:41:02
前文叙述了IDispatch接口的原理,本文先讲MFC的实现细节,下文讲ATL的实现细节。 1.通用方法 MFC不使用类型库,这里先讲不用类型库实现IDispatch,此时一般实现GetIDsOfNames和Invoke函数。这里使用MFC实现,实际上在ATL中也可以使用。 按照之前讲的通用接口的编写方法,定义嵌入类和工厂类声明如下,嵌入类实现了IDispatch接口。 //接口映射表 BEGIN_INTERFACE_PART(Cat, IDispatch) INIT_INTERFACE_PART(CAnimalObject, Cat) virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* [out] */ __RPC__out UINT *pctinfo); virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo); virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* [in] */ __RPC__in REFIID riid, /*

MFC与ATL在COM组件开发中的差异和优劣

我与影子孤独终老i 提交于 2019-12-07 04:38:00
很多年前,微软提供了COM组件对象模型。 随后,提供了COM SDK。 后来,又在MFC中,增加了COM开发的支持。 再后来,又提供了ATL类库,对COM开发提供了更强大的支持。 本文从使用MFC和ATL开发COM组件的角度,来分析比较两者的差异和优劣。 MFC代码部分 首先,需要继承一个基类,并声明成动态创建类(RuntimeClass)。 //.h class CComMFCDemo : public CCmdTarget { DECLARE_DYNCREATE ( CComMFCDemo ) }; //.cpp IMPLEMENT_DYNCREATE ( CComMFCDemo , CCmdTarget ) 然后,声明并实现COM功能函数。 //.h class CComMFCDemo : public CCmdTarget { BSTR Greeting(BSTR name); long Add( long val1, long val2); long Sub( long val1, long val2); }; //.cpp BSTR CComMFCDemo::Greeting(BSTR name) { CComBSTR tmp( "Welcome, " ); tmp.Append(name); return tmp; } long CComMFCDemo::Add(

ATL Based Linker Errors

百般思念 提交于 2019-12-07 04:15:27
问题 I got a linking problem with atls.lib lately. I updated my linker's additional dependencies lines with: comctl32.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atls.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atl.lib C:\WinDDK\7600.16385.1\lib\ATL\i386\atlsd.lib However, now, I started getting these errors. What can cause these problems? Thank you very much. ------ Build started: Project: hede, Configuration: Debug Win32 ------ Linking... atlsd.lib(externs.obj) : error LNK2005: "char const * const g