2011-04-14 119 views
4

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

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

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

UPDATE:我添加 “

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

” 处被加载到web浏览器的HTML的顶部。它没有帮助。

+0

你有没有解决过这个问题?我有完全相同的问题!问候。 – 2011-07-15 17:24:10

+1

不,我没找到解决问题的办法。但我使用了一种解决方法:我在.net主机(WebBrowser所在的位置)中创建了ActiveX,并使其可用于WebBrowser内的JS代码。 – Shrike 2011-07-22 21:53:58

+1

您能否为您的解决方案提供详细信息,包括代码示例?我有类似的问题!问候。 – 2015-03-05 10:05:31

回答

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