0

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

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

谢谢。

4

3 回答 3

1

我对 MFC ActiveX 包装器不是很熟悉,但我可以从一般意义上回答这个问题:

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

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

于 2008-11-06T23:14:56.117 回答
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>
于 2008-11-19T12:02:18.553 回答
0

如果您使用的是 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(),这也可能是您想要的。

于 2009-05-07T00:00:12.497 回答