之前,我在VC6下写了一个DLL代码。有很多输出函数和回调函数。
里面还定义了很多的结构。现在需要把这个VC6项目移植到VS2005环境下的COM组件中。目前,我已经实现了一个完整的ATL组件。
原来的输出函数我都给封装在组件的一个出口类中。
原来的回调函数我用事件响应函数代替了。
原来的结构我都封装成“ATL简单组件”了。我在组件中,对于回调函数的代码有如下几步:
第一步:创建一个回调函数如下:
CBFun_EvQuery(const SEvIn* pEvIn, double dReserv, int nDataType, double dData)第二步:创建外部响应函数
同时,我在组件的事件集合“_IEvEntryEvents”中添加了“事件响应函数”,如下所示:
CEvent_EvQuery([in] IDispatch* pEvIn, [in] DOUBLE dReserv, [in] LONG nDataType, [in] DOUBLE dData, [in] LONG nResult);
CEvent_EvQuery是用来给上层的C#程序捕获事件的函数。第三步:关联“事件连接点”
当我在CEvEntry类(这个是我所有输出函数的接口的入口类)上关联了“事件连接点”之后,系统会自动实现连接点“Fire”函数,如下:
Fire_CBFun_EvQueryIn( IDispatch * pEvIn,  DOUBLE dReserv,  LONG nDataType,  DOUBLE dData,  LONG nResult)第四步:最终运行中的情况是:
当组件内部的程序需要有事件反馈给上层C#程序时,会调用CBFun_EvQuery。
在CBFun_EvQuery函数中,会调用连接点“Fire”函数Fire_CBFun_EvQueryIn。
由“Fire”函数Fire_CBFun_EvQueryIn完成最终对C#程序的事件通知动作。现在的问题是:
在CBFun_EvQuery被调用时,CBFun_EvQuery的第一个参数SEvIn* pEvIn是个结构,而CBFun_EvQuery函数里面又要调用Fire_CBFun_EvQueryIn函数。而Fire_CBFun_EvQueryIn函数的第一个参数是IDispatch * pEvIn的。
我被困扰的问题是:如何从SEvIn*结构指针到IDispatch 指针进行转换?不知道我说的清楚不,在此先多谢大家的帮忙。

解决方案 »

  1.   

    补充一点:
    SEvIn结构已经被我封装成“ATL简单组件对象”了。其类实现是CEvIn、接口是interface IEvIn : IDispatch。
    SEvIn结构的各个成员变量也映射到IEvIn 的各个属性,我也实现了它们的get、put函数。我猜想:从SEvIn*结构指针到IDispatch 指针的转换
    是否应该是从SEvIn*结构指针到CEvIn对象或接口的转换,最后才是到IDispatch 指针的转换?
    可我就是不知道具体该怎么办,已经试验了2天了。一点头绪也没有。