【问题标题】:Run a ATL COM DLL from a Browser (call a method)从浏览器运行 ATL COM DLL(调用方法)
【发布时间】:2013-10-19 17:50:22
【问题描述】:

我有一个使用 ATL(不支持 MFC)创建的 COM 对象

对象有 1 个方法可以打开一个对话框(其余的都做)

目前我从另一个 EXE 调用它:

hr = CoCreateInstance(
    CLSID_MyControl,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_IMyControl,
    (void**) &pMyControl
    );

然后:

hr = pMyControl->MyMethod (ATL::CComBSTR(InputString1), ATL::CComBSTR(InputString2), &IntReturned, &IntReturned);

是否可以从浏览器中按原样调用它?

如何实例化对象并从浏览器调用我的方法(使用参数)?

【问题讨论】:

  • 在 IE 中?在任何浏览器中?
  • 有很多方法可以从 IE 或基于 WebBrowser 的应用程序执行此操作,但不能从任何其他浏览器(不是没有单独的插件)。

标签: c++ visual-studio-2012 com activex atl


【解决方案1】:

回答你问题的几点:

  • 除了 IE 或基于 WebBrowser 的应用程序之外,您将无法在任何浏览器中使用 COM 对象。

  • 您需要实现IObjectSafety 接口以允许IE 创建您的对象。自然地,该对象对于任何不受信任的来源的脚本来说应该是安全的。理想情况下,您应该 lock the object 加入您自己的网站列表。您可以为此使用SiteLock 模板。

  • 对象应实现IDispatch 接口,以便可用于脚本。最好的方法是使用 ATL 的IDispatchImpl(很可能已经在您的代码中完成了)。

  • 示例中的MyMethod 使用两个[out] 参数作为IntReturned。 JavaScript 只允许一个输出 [out, retval] 参数。如果需要返回多个值,则必须使用 VBScript。

示例(替换您的 CLSID):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "">
<html>
<head>
    <title></title>
    <script type="text/vbscript">
        Option Explicit
        window.onload = GetRef("OnLoadHandler")

        Sub OnLoadHandler
            Dim InputString1
            Dim InputString2
            Dim IntReturned1
            Dim IntReturned2

            InputString1 = "a"  
            InputString1 = "b"  
            testObject.MyMethod InputString1, InputString2, IntReturned1, IntReturned

            alert "Result: " & IntReturned1 & ", " & IntReturned
        End Sub
    </script>
</head>

<body>
    <object id="testObject" classid="clsid:12345678-1234-1234-1234-1234567890AB">
        <span>Unable to create the object.</span>
    </object>
</body>
</html>

如果您不实现IObjectSafety,您仍然可以将此代码作为 HTML 应用程序运行。将其保存为 .HTA 文件,如果 C++ COM DLL 是 32 位,则以 C:\Windows\SysWOW64\mshta.exe C:\users\user\Documents\test.hta 运行,如果是 64 位,则以 C:\Windows\System32\mshta.exe C:\users\user\Documents\test.hta 运行。

COM DLL 需要首先使用regsvr32.exe 注册(如果您可以从 C++ 客户端项目中使用它,您可能已经这样做了)。

【讨论】:

  • 另一种方法是使用VBScript的testObject = CreateObject("YourComClass.ProgID")或JavaScript的var testObject = new ActiveXObject("YourComClass.ProgID")动态创建对象。
猜你喜欢
  • 2013-09-08
  • 2012-03-10
  • 1970-01-01
  • 2013-06-21
  • 2014-03-13
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 2011-06-23
相关资源
最近更新 更多