2013-10-11 50 views
1

我使用ATL COM对象创建(没有MFC支持)从浏览器中运行一个ATL COM DLL(调用方法)

对象已打开一个对话框(即做所有的休息)

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); 

是否有可能到c所有这些都来自浏览器?

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

+1

在IE中?在任何浏览器? –

+0

从IE或基于WebBrowser的应用程序有很多方法可以做到这一点,但不能从任何其他浏览器(不是没有单独的插件)。 – Noseratio

回答

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

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

+0

另一种方法是用VBScript的'testObject = CreateObject(“YourComClass.ProgID”)'或JavaScript的'var testObject = new ActiveXObject(“YourComClass.ProgID”)'动态地创建对象。 – Noseratio