VC组件提供addListener方法,其中一个参数是CALLBACK
当JS脚本进行调用时,会传入一个函数对象参数
目的是在A方法中可以直接调用JS传入的函数对象参数碰到问题:在VS2005中,如果把此参数在BEGIN_DISPATCH_MAP里声明为VTS_VARIANT,函数声明中为VARIANT&,如下面情况
VARIANT DeskConsole::addListener(LPCSTR listenerName, VARIANT& functionObj)
在BEGIN_DISPATCH_MAP(DeskConsole, CCmdTarget)中声明为 DISP_FUNCTION_ID(DeskConsole, "addListener", dispidaddListener, addListener, VT_VARIANT, VTS_BSTR VTS_VARIANT)
可以发现如果把传入参数直接返回的话,如果返回得到Object的话,是可以以object(参数)进行调用,说明VARIANT变量应该是保存了函数对象信息。
但怎么也无法直接在VC的组件方法中直接进行调用如果进行以下声明的时候
typedef void (CALLBACK* CallBack)(void);
long DeskConsole::addListener(LPCSTR listenerName, CallBack functionObj)
不知道在在BEGIN_DISPATCH_MAP(DeskConsole, CCmdTarget)中最后个参数应该声明为啥类型,我用VTS_VARIANT或者VTS_UNKNOWN都不正确,希望有人能帮我解答下,真是不胜感激

解决方案 »

  1.   

    脚本语言不支持VC形式的回调函数,所以 typedef void (CALLBACK* CallBack)(void) 作为参数类型是错误的。
    脚本中函数也是对象,所以把函数作为参数传递的时候其类型是IDispatch*,所以方法应该这样定义 addListener(BSTR name, IDispatch* callback)
      

  2.   

    多谢指教,那问下这个IDispatch我得到以后,能实现我的目标进行回调吗?还是说脚本语言就不能实现这样的功能
      

  3.   

    可以回调,按照下面的方法调用:
    callback->Invoke(0, ...); 注意第一个参数值是0
      

  4.   

    其实可以利用vc中IDispatch接口来直接调用js的脚本函数.. Invoke()
      

  5.   

    通过GetIDsOfNames获得函数id dispId,然后Invoke(dispId,...)调用对应的js函数
      

  6.   

    非常感谢,已经达到想要的效果
    上面说的GetIDsOfNames获得函数id dispId是可以的,我原来就是这么做的,但当JS中较复杂的时候,根据名称会有些问题。所以才出来了这个帖子,非常感谢。寥寥数语,解决了几个晚上都睡不着的问题