【问题标题】:How to build an ActiveX object in C++ that can be scripted using Javascript如何在 C++ 中构建可以使用 Javascript 编写脚本的 ActiveX 对象
【发布时间】:2010-09-21 04:49:45
【问题描述】:

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

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

谢谢。

【问题讨论】:

    标签: javascript c++ com interop activex


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这适用于将您的 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>
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 一个微不足道的更正,DECLARE_DISPATCH_MAP() 应该遵循函数声明。
        猜你喜欢
        • 1970-01-01
        • 2015-12-25
        • 2019-12-05
        • 1970-01-01
        • 1970-01-01
        • 2012-11-25
        • 2011-08-15
        • 1970-01-01
        • 2013-03-21
        相关资源
        最近更新 更多