我正在尝试使用ATL创建一个COM组件,我想为我的VB客户端引发事件.我发现了很多教程,所有这些教程的细节都各不相同,而且它们似乎都没有产生可行的解决方案.这是我在做的事情:
(使用Visual Studio 2008):
>创建一个新的ATL DLL项目.我称之为ATLEventTest.
>类视图:右键单击ATLEventTest,添加了一个新的ATL简单对象类.
我调用了MyObject,它生成了CMyObject,IMyObject等…
>此对象创建于:
a)公寓线程
b)聚合
c)双接口
d)ISupportErrorInfo
e)连接点
>右键单击CProxy_IMyObjectEvents< T>,单击“添加功能”
>函数是void返回类型,名为someEvent,并采用int testParam.
>重建.
(此时,我应该可以在某个地方看到’实施连接点’.我不……)
>右键单击CMyObject. ‘添加连接点’
>将’_IMyObjectEvents’移到列表中.
>我的解决方案中是否有代码搜索.在任何地方找不到一些事件!
>再次添加了someEvent函数.现在,它可以在ATLEventTest_i.h中找到
>应该能够在我的代码中调用fire_someEvent(…),但不能.
这让我疯狂,试图让它发挥作用.如果有人能看到我做错了什么,我会感谢任何更正,提示,黑客等.
在这一点上,我很想说要搞砸巫师,并试着直接修改c和idl,但我有一种可能不太好的感觉:(
解决方法:
尝试使用此位置概述的方法:
使用上面给出的示例名称,在MyObject.idl文件中,即使在dispinterface _IMyObjectEvents部分下也应该看到出站声明.由于您右键单击CProxy_IMyObjectEvents< T>而不是在库下的_IMyObjectEvents上,您的IDL可能缺少定义.自动生成的文件_IMyObjectEvents_CP.h文件应存在于项目头文件中,并且应该包含Fire_someEvent()方法,以便正确添加方法.如果没有,您可能会发现它只是创建了一个名为someEvent()的方法.
以下是您可以在测试项目中尝试的大纲.
>创建一个新的ATL DLL项目.我称之为ATLEventTest1.
>建设项目.
>类视图:右键单击ATLEventTest1,添加一个新的ATL简单对象类.称之为MyObject.
>创建定义a)公寓线程b)双界面c)连接点和你需要的任何其他东西.
>重建项目.
>类视图:找到ATLEventTest1Lib库,右键单击_MyObjectEvents,然后单击“添加方法”.
> Method是void返回类型,名为someEvent,并采用带参数attribute [in]的int testParam.
>作为添加参数的结果,您应该看到“[in] int testParam”.
>在“IDL属性”选项卡上,根据需要更改ID.单击完成.
>类视图:右键单击CMyObject,转到添加…,转到实现连接点.
>选择_IMyObjectEvents并单击“>”将其移动到已实现的连接点列表.单击完成.
>重建.
>现在,在您的CMyObject类中,您应该能够调用Fire_someEvent().您将在调度接口_IMyObjectEvents下的ATLEventTest1.idl文件中看到一个新方法;将创建头文件_IMyObjectEvents_CP.h文件,并将为Fire_someEvent()创建广播代码.