Как разрешить создание ActiveX в элементе управления WebBrowser - PullRequest
5 голосов
/ 14 апреля 2011

У меня есть контроль WebBrowser в моей программе .NET. На самом деле не имеет значения, какая оболочка .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 -->

» в верхней части HTML, который загружается в WebBrowser. Это не помогает.

1 Ответ

1 голос
/ 10 марта 2015

Вот обходной путь для 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 клиента мы должны получить доступ к экземпляру HostGateway через window.external:

window.external.MyComponent.foo();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...