我已经能够将webkit控件嵌入到Windows(c ++)应用程序中,并注册了我的自定义对象供javascript访问(使用JSGlobalContextRef,JSObjectMake等)。成功测试了从JavaScript到c ++层的调用是否可以返回字符串或整数的简单方法。
现在,我想公开一个自定义方法,该方法将在内部使用COM库并最终返回IDispatch指针(包装为VARIANT或其他形式)。如何将IDispatch指针转换为JSValueRef,JSObjectRef或JavaScript(在Webkit内部)可以理解的其他任何内容?
在IE浏览器控件世界中,我可以简单地通过“ getExternal”(IDocHostUIHandler接口)公开IDispatch,甚至将其包装在VARIANT中,并以自定义“外部”对象内任何其他API的Out-Param形式返回。
最佳答案
这个问题没有简单的n步答案。我通过Google搜索找到的代码解决了类似的问题,即从SpiderMonkey访问COM对象。我可以为您提供可能使用的方法,我不再链接到实际的代码,而且它还是特定于SpiderMonkey的。
您的Javascript引擎有一些方法可以用自定义对象扩展它,您显然已经在使用它们。您需要定义要实现的这个新方法返回另一种类型的自定义对象,并将IDispatch指针放在该自定义对象的自定义数据中。您的JS引擎不会“理解”或关心自定义对象是ActiveX对象的外观。您只需设置这种类型的自定义对象,以便在调用其Frob方法时,外观将调用委托给IDispatch上的Frob DISPID。
如果这个答案不清楚,请给我一个提示,我们至少在说相同的语言。