我可以使用 VS08 的 MFC/ActiveX 模板来创建一个 C++ ActiveX 对象,我可以将其加载到 HTML 页面中并使用 Javascript 编写脚本。但我不知道如何创建一个接口,允许我使用 Javascript 在我的组件上调用自定义方法。
你能告诉我如何做到这一点吗?我在谷歌上花了两个多小时没有运气。
谢谢。
我可以使用 VS08 的 MFC/ActiveX 模板来创建一个 C++ ActiveX 对象,我可以将其加载到 HTML 页面中并使用 Javascript 编写脚本。但我不知道如何创建一个接口,允许我使用 Javascript 在我的组件上调用自定义方法。
你能告诉我如何做到这一点吗?我在谷歌上花了两个多小时没有运气。
谢谢。
我对 MFC ActiveX 包装器不是很熟悉,但我可以从一般意义上回答这个问题:
可以通过自动化语言(例如:Javascript)调用具有从 IDispatch 派生的接口的 COM 对象。这些方法还必须是“自动化兼容的”,这意味着参数可以转换为 VARIANT 类型,或者显式地属于 VARIANT 类型。请注意,对于输入/输出参数,类型必须为 VARIANT*,自动化“连接”才能工作。
我不知道如何使 ActiveX 对象在客户端脚本中可访问(例如:将其嵌入到页面中),但如果它具有从 IDispatch 派生的单个接口,则可以从 Javascript(和其他自动化语言)调用它。我希望这会有所帮助...
这适用于将 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>
如果您使用的是 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()
我从来没有使用过这个,但这是你的调度接口——也就是你的对象上的方法,其他人可以调用。这是什么意思:
不过,还有 DECLARE_MESSAGE_MAP() 和 DECLARE_EVENT_MAP(),这也可能是您想要的。