1

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

对象有 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);

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

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

4

1 回答 1

3

回答你的问题的几点:

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

  • 您需要实现IObjectSafety接口以允许 IE 创建您的对象。自然,该对象对于任何不受信任的来源的脚本来说应该是安全的。理想情况下,您应该将对象锁定到您自己的站点列表中。您可以为此使用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:\Windows\SysWOW64\mshta.exe C:\users\user\Documents\test.htaC++ COM DLL 是 32 位或C:\Windows\System32\mshta.exe C:\users\user\Documents\test.hta64 位一样运行。

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

于 2013-10-12T02:24:38.203 回答