无法使ATL连接点正常工作

3 c++ com events atl connection-points

我正在尝试使用ATL创建一个COM组件,我想为我的VB客户端引发事件.我发现了很多教程,所有这些教程的细节都各不相同,但它们似乎都没有产生可行的解决方案.这是我在做的事情:

(使用Visual Studio 2008):

  1. 创建一个新的ATL DLL项目.我打电话给它ATLEventTest.
  2. 类视图:右键单击ATLEventTest,添加了一个新的ATL简单对象类.我叫这个MyObject,它产生的CMyObject,IMyObject等...
  3. 该对象创建于:a)公寓线程b)聚合c)双界面d)ISupportErrorInfo e)连接点

  4. 右键单击CProxy_IMyObjectEvents<T>,单击"添加功能"

  5. 函数是void返回类型,命名someEvent,并采用int testParam.
  6. 重建.
    (此时,我应该可以在某个地方看到'实施连接点'.我不......)
  7. 右键单击CMyObject.'添加连接点'
  8. "移动_IMyObjectEvents"在进入名单.
  9. 在我的解决方案中进行了代码搜索.找不到someEvent任何地方!
  10. someEvent再次添加了该功能.现在,它可以在ATLEventTest_i.h中找到
  11. 应该可以fire_someEvent(...)在我的代码中调用,但不能.

这让我疯狂,试图让它发挥作用.如果有人能看到我做错了什么,我会感谢任何更正,提示,黑客等.

在这一点上,我很想说要搞砸巫师,并试着直接修改c ++和idl,但我有一种可能不太好的感觉:(

mek*_*ian 5

尝试使用此位置概述的方法:

添加事件(ATL)@ MSDN

使用上面给出的示例名称,在MyObject.idl文件中,即使在dispinterface _IMyObjectEvents部分下也应该看到出站声明.由于您右键单击CProxy_IMyObjectEvents <T>而不是库下的_IMyObjectEvents,因此您的IDL可能缺少定义.自动生成的文件_IMyObjectEvents_CP.h文件应存在于项目头文件中,并且应该包含Fire_someEvent()方法,以便正确添加方法.如果没有,您可能会发现它只是创建了一个名为someEvent()的方法.

以下是您可以在测试项目中尝试的大纲.

  1. 创建一个新的ATL DLL项目.我称之为ATLEventTest1.
  2. 建设项目.
  3. 类视图:右键单击ATLEventTest1,添加一个新的ATL简单对象类.称之为MyObject.
  4. 使用a)公寓线程创建定义b)双界面c)连接点和您需要的任何其他内容.
  5. 重建项目.
  6. 类视图:找到ATLEventTest1Lib库,右键单击_MyObjectEvents,然后单击"添加方法".
  7. 方法是void返回类型,名为someEvent,并采用带参数attribute [in]的int testParam.
  8. 作为添加参数的结果,您应该看到"[in] int testParam".
  9. 在"IDL属性"选项卡上,根据需要更改ID.单击完成.
  10. 类视图:右键单击CMyObject,转到添加...,转到实现连接点.
  11. 选择_IMyObjectEvents并单击">"将其移动到已实现的连接点列表.单击完成.
  12. 重建.
  13. 现在,在您的CMyObject类中,您应该能够调用Fire_someEvent().您将在调度接口_IMyObjectEvents下的ATLEventTest1.idl文件中看到一个新方法; 将创建头文件_IMyObjectEvents_CP.h文件,并将为Fire_someEvent()创建广播代码.

  • (由于Visual Studio 2012/2010/maybe2008中的BUG)11.pre不要对"Avaliable type libraires"使用默认的"Embedded IDL"项,您应该手动选择项目的类型库. (2认同)