描述:
我在ATL工程中添加一个simple object,并在attribute选项中指定dual和support connection point选项,这时会在工程中出现事件接口。我随便添加一个入接口函数Test()和一个出接口函数TestResp()。要想调用事件响应,必须实现连接点,我首先对工程进行编译,产生tlb文件,然后使用连接点向导并指定该tlb文件并选中刚才的事件接口,这时产生一个连接点实现的包装类CProxy_IMyAdvCalcEvents。现在我开始编译我的工程, 会出现错误和警告:
CalcClt.exe - 13 error(s), 8 warning(s)
具体的错误信息我贴出来:
Compiling...
Calc.cpp
e:\testprojects\disp\calc\debug\calc.tlh(17) : warning C4099: 'MyCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(56) : see declaration of 'MyCalc'
e:\testprojects\disp\calc\debug\calc.tlh(22) : warning C4099: 'MyAdvCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(74) : see declaration of 'MyAdvCalc'
e:\testprojects\disp\calc\debug\calc.tlh(39) : warning C4099: 'MyCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(56) : see declaration of 'MyCalc'
e:\testprojects\disp\calc\debug\calc.tlh(43) : error C2011: 'IMyCalc' : 'struct' type redefinition
e:\testprojects\disp\calc\debug\calc.tlh(56) : error C2011: '_IMyAdvCalcEvents' : 'struct' type redefinition
e:\testprojects\disp\calc\debug\calc.tlh(60) : warning C4099: 'MyAdvCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(74) : see declaration of 'MyAdvCalc'
e:\testprojects\disp\calc\debug\calc.tlh(65) : error C2011: 'IMyAdvCalc' : 'struct' type redefinition
e:\testprojects\disp\calc\debug\calc.tlh(72) : error C2374: 'LIBID_CALCLib' : redefinition; multiple initialization
e:\testprojects\disp\calc\calc.h(303) : see declaration of 'LIBID_CALCLib'
e:\testprojects\disp\calc\debug\calc.tlh(74) : error C2374: 'CLSID_MyCalc' : redefinition; multiple initialization
e:\testprojects\disp\calc\calc.h(305) : see declaration of 'CLSID_MyCalc'
e:\testprojects\disp\calc\debug\calc.tlh(76) : error C2374: 'IID_IMyCalc' : redefinition; multiple initialization
e:\testprojects\disp\calc\calc.h(96) : see declaration of 'IID_IMyCalc'
e:\testprojects\disp\calc\debug\calc.tlh(78) : error C2374: 'DIID__IMyAdvCalcEvents' : redefinition; multiple initialization
e:\testprojects\disp\calc\calc.h(320) : see declaration of 'DIID__IMyAdvCalcEvents'
e:\testprojects\disp\calc\debug\calc.tlh(80) : error C2374: 'CLSID_MyAdvCalc' : redefinition; multiple initialization
e:\testprojects\disp\calc\calc.h(419) : see declaration of 'CLSID_MyAdvCalc'
e:\testprojects\disp\calc\debug\calc.tlh(82) : error C2374: 'IID_IMyAdvCalc' : redefinition; multiple initialization
e:\testprojects\disp\calc\calc.h(192) : see declaration of 'IID_IMyAdvCalc'
e:\testprojects\disp\calc\calccp.h(7) : fatal error C1903: unable to recover from previous error(s); stopping compilation
e:\testprojects\disp\calc\mycalc.h(15) : see reference to class template instantiation 'CProxy_IMyAdvCalcEvents<class CMyCalc>' being compiled
MyCalc.cpp
e:\testprojects\disp\calc\debug\calc.tlh(17) : warning C4099: 'MyCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(56) : see declaration of 'MyCalc'
e:\testprojects\disp\calc\debug\calc.tlh(22) : warning C4099: 'MyAdvCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(74) : see declaration of 'MyAdvCalc'
e:\testprojects\disp\calc\debug\calc.tlh(39) : warning C4099: 'MyCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(56) : see declaration of 'MyCalc'
e:\testprojects\disp\calc\debug\calc.tlh(43) : error C2011: 'IMyCalc' : 'struct' type redefinition
e:\testprojects\disp\calc\debug\calc.tlh(56) : error C2011: '_IMyAdvCalcEvents' : 'struct' type redefinition
e:\testprojects\disp\calc\debug\calc.tlh(60) : warning C4099: 'MyAdvCalc' : type name first seen using 'class' now seen using 'struct'
e:\testprojects\disp\calc\calc.h(74) : see declaration of 'MyAdvCalc'
e:\testprojects\disp\calc\debug\calc.tlh(65) : error C2011: 'IMyAdvCalc' : 'struct' type redefinition
---------------------------------------------------------------------
请有经验的朋友帮我指点一下如何使用该向导,为什么向导产生的代码不能直接编译呢?
解决方案1:
一个Atl对象应该只对应一个ControlEvents,你有两个Atl对象,应该要定义两个不同的ControlEvents吧
解决方案2: "然后使用连接点向导并指定该tlb文件并选中刚才的事件接口"
直接使用默认的"项目(P)"的idl文件 实现连接点
您可能想查找下面的文章:
- 在ATL工程中怎么写文件?用fprintf老是报错!!!
- 请教:ATL工程中定时器的使用
- 我在一个ATL工程中使用_bstr_t还要加#include<atlctlh>头文件吗,不加说bstr_t没定义,加了出现2个连接错误
- 我希望创建一个类似于MFC工程一样的有窗口的ATL工程,但是用默认的ATLwizard创建的却是无窗口的控件,那我该怎么办呢?
- 把某个ATL工程的功能移植到MFC的工程里怎么就那么难?
- ATL工程中两个类之间参数怎么调用
- ATL工程中一个支持连接点的接口实现类中能够增加多个入接口,出接口?
- ATL工程中使用MFC类的问题
- 在vs2005中建一个atl工程,为什么会出现二个同名工程,第二个是第一个名称后加ps
- 做一个ATL的EXE工程,为什么编译的时候会运行一次?