如何在WebBrowser控件中允许ActiveX创建

时间:2011-04-14 08:43:23

标签: activex webbrowser-control

我的.NET程序中有WebBrowser控件。实际上使用哪个.net包装器(wpf或winforms)并不重要,因为它们都包含ActiveX组件“Microsoft Internet Controls”(ieframe.dll)。

所以我将一些html / js代码加载到WebBrowser中。此代码尝试创建一些ActiveX并失败。当它加载到完整的IE时,完全相同的代码工作正常。但在WebBrowser失败:新的ActiveXObject(“myprogid”)抛出“自动化服务器无法创建对象”。

WebBrowser控件是否具有允许创建ActiveX的能力?

更新:我添加了“

<!-- saved from url=(0014)about:internet -->

” 在加载到WebBrowser的html顶部。它没有帮助。

2 个答案:

答案 0 :(得分:1)

这是WPF的解决方法 MainWindow.xaml:

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:wf="clr-namespace:System.Windows.Forms;assembly=system.windows.forms"
    >
    <Grid>
        <WebBrowser x:Name="webBrowser" SnapsToDevicePixels="True" >
        </WebBrowser>
    </Grid>
</Window>

MainWindow.xaml.cs:

public void Run(Uri uri)
{
    m_gateway = new HostGateway
                {
                    MyComponent = SomeNativeLib.SomeNativeComponent
                };

    webBrowser.ObjectForScripting = m_gateway;

    webBrowser.Navigate("about:blank");
    webBrowser.Navigate(uri);
}

[ComVisible(true)]
public class HostGateway
{
    public SomeNativeLib.SomeNativeComponent MyComponent {get;set;}
}

我们需要添加本机库作为参考:

<Reference Include="SomeNativeLib, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
  <EmbedInteropTypes>True</EmbedInteropTypes>
  <HintPath>..\..\..\References\SomeNativeLib.dll</HintPath>
</Reference>

然后在我们的客户端js代码中,我们必须通过window.external访问HostGateway实例:

window.external.MyComponent.foo();

答案 1 :(得分:0)

我最近遇到了同样的问题,我的解决方法(不需要任何其他引用)只是拥有一个名为ActiveXObject的javascript函数和一个名为Activator.CreateInstance的C#函数,一个非常简单的例子:

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

[ComVisible(true)]
public class TestForm :
    Form {

    public Object newActiveXObject(String progId) {
        return(Activator.CreateInstance(Type.GetTypeFromProgID(progId)));
    }

    public TestForm() {
        Controls.Add(
            new WebBrowser() {
                ObjectForScripting = this,
                DocumentText =
                    "<script>" +
                    "function ActiveXObject(progId) { return(window.external.newActiveXObject(progId)); }" +
                    "document.write('<pre>' + new ActiveXObject('WScript.Shell').exec('cmd /c help').stdOut.readAll() + '</pre>');" +
                    "</script>",
                Dock = DockStyle.Fill
            }
        );
    }

    [STAThread]
    public static void Main() {
        Application.EnableVisualStyles();
        Application.Run(new TestForm());
    }

}