3

我正在尝试使用 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,但我有一种感觉可能不会更好:(

4

6 回答 6

5

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

添加事件 (ATL) @ MSDN

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

这是您可以在测试项目中尝试的大纲。

  1. 创建一个新的 ATL DLL 项目。我称它为 ATLEventTest1。
  2. 构建项目。
  3. 类视图:右键单击 ATLEventTest1,添加一个新的 ATL Simple Object 类。称它为 MyObject。
  4. 使用 a) 单元线程 b) 双接口 c) 连接点和您需要的任何其他内容创建定义。
  5. 重建项目。
  6. 类视图:找到 ATLEventTest1Lib 库,右键单击 _MyObjectEvents,然后“添加方法”。
  7. 方法是 void 返回类型,名为 someEvent,并采用带有参数属性 [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() 的广播代码。
于 2009-06-14T21:23:01.430 回答
1

你的班级是否有 IProvideClassInfo/IProvideClassInfo2 的实现?如果我记得对于非控制对象,VB 需要它来定位事件源接口。

尝试这个:

public IProvideClassInfo2Impl<&CLSID_MyClass NULL, &LIBID_ATLEventTest, 1, 0>,

然后在界面图

COM_INTERFACE_ENTRY(IProvideClassInfo)
COM_INTERFACE_ENTRY(IProvideClassInfo2)
于 2009-06-14T23:39:24.800 回答
0

好的。因此,在重新构建新系统后,我已经安装了 Visual Studio 2005 和 Visual Studio 2008。我可以在 2005 年完美地使用它。仍然无法在 2008 年工作。看起来我只需要在 VS2005 上为我的 ATL 东西工作......

再次感谢所有帮助过的人。

于 2009-07-01T01:36:41.773 回答
0

我遇到了同样的问题。继续阅读MSDN文档并在线搜索。最后,我想通了。

向导没有做的主要事情是将声明放入 IDL 文件中。我手动添加了它,在我的课堂上,有一个“Fire_”。

希望这对您有所帮助。

于 2009-07-23T07:36:31.570 回答
0

也许你对单元线程有问题。您是否在 VB 上编写控制台应用程序?它需要一个经典的消息泵才能正常工作(例如经典的 windows 应用程序)。在您的 COM 对象 (MTA) 上尝试不同的公寓模式。

于 2009-06-15T22:18:51.990 回答
0

我可以通过从控件的 .h 文件中删除所有 _I***Events 引用来解决类似的问题

于 2014-06-27T19:50:57.660 回答