如何在C ++中构建一个可以使用Javascript编写脚本的ActiveX对象

时间:2008-11-06 22:41:06

标签: javascript c++ com interop activex

我可以使用VS08的MFC / ActiveX模板创建一个C ++ ActiveX对象,我可以使用Javascript将其加载到HTML页面和脚本中。但我无法弄清楚如何创建一个允许我使用Javascript在我的组件上调用自定义方法的接口。

你能告诉我怎么做到这一点吗?我在谷歌上花了两个多小时没有运气。

感谢。

3 个答案:

答案 0 :(得分:2)

我不是非常熟悉MFC ActiveX包装器,但我可以回答一般意义上的问题:

可以通过自动化语言(例如:Javascript)调用具有从IDispatch派生的接口的COM对象。这些方法也必须是“自动化兼容的”,这意味着参数可以转换为VARIANT类型,或者显式为VARIANT类型。请注意,对于输入/输出参数,类型必须为VARIANT *才能使自动化“连接”起作用。

我不知道如何在客户端脚本中访问ActiveX对象(例如:将其嵌入到页面中),但如果它具有从IDispatch派生的单个接口,则可以从Javascript(和其他自动化)调用它语言)。我希望有帮助...

答案 1 :(得分:1)

这适用于将ActiveX容器嵌入到html页面中并调用方法:

<html> 
<body> 
<object height="0" width="0" id="myControl" classid="CLSID:AC12D6F8-AEB7-4935-B3C9-0E4FB6CF7FB1" type="application/x-oleobject">
</object>
<script>
    var activexObj = document.getElementById('myControl');
    if(activexObj != null)
    {
        var result = myControl.myMethod();
        document.write("Result: " + result + "<br/>");
    }
    else
    {
        document.write("ActiveX component not found!<br/>");
    }
</script>
</body>
</html>

答案 2 :(得分:1)

如果您正在使用VS08 MFC ActiveX模板,您可能会在控件的.h文件中看到这样的代码段(在类声明中,它受到保护):

afx_msg void AboutBox();

DECLARE_DISPATCH_MAP()

在.cpp文件中有这样的一个:

// Dispatch map

BEGIN_DISPATCH_MAP(CActiveXOutlookCtrl, COleControl)
    DISP_FUNCTION_ID(yourCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE)
END_DISPATCH_MAP()

我从来没有使用过这个,但这是你的调度界面 - 也就是其他人可以调用的对象上的方法。这意味着什么:

  • “AboutBox”是他们用来调用它的名称。
  • DISPID_ABOUTBOX是函数的整数id(我认为它是任意的。我使用正数,因为默认情况下会使用很多负数)。
  • AboutBox是方法名称。
  • VT_EMPTY是方法的返回类型。
  • VTS_NONE是它所采用的参数类型。

虽然也有DECLARE_MESSAGE_MAP()和DECLARE_EVENT_MAP(),这可能也与你想要的有关。