代码之家  ›  专栏  ›  技术社区  ›  nlaq

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

  •  0
  • nlaq  · 技术社区  · 16 年前

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

    谢谢

    3 回复  |  直到 16 年前
        1
  •  1
  •   Nick    16 年前

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

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

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

        2
  •  1
  •   korona    16 年前

    <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>
    
        3
  •  0
  •   Adam A    16 年前

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