从浏览器运行ATL COM DLL(调用方法)

时间:2013-10-11 15:21:02

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

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

Object有一个方法可以打开一个Dialog(完成所有其余的操作)

目前我从另一个EXE呼叫它:

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

然后:

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

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

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

1 个答案:

答案 0 :(得分:3)

回答你问题的一些要点:

  • 除了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

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