Home All Groups Group Topic Archive Search About

Using AxWebBrowser in VB 2005

Author
16 Mar 2006 5:32 PM
Doe
Okay, I've given up on using the "new" WebBrowser in 2005 to do what I
want to do -- tabbed browsing. It seems I really need RegisterAsBrowser
and Application to get each instance of a browser working on each tab
(and those methods are not available in 2005).

I found some code on MSDN forums, but the extention didn't really cover
RegisterAsBrowser. Someone told me how to do it, but it's in c and
basically over my head. Even though he later added some VB code (<In>
should be changed to <[In]>). I would need definitions for each
OLECMD... and I couldn't figure out what to attach the interfaces to...

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=283565&SiteID=1...


Sigh. So I figured, okay, this is a LOT OF TROUBLE just to make the
"new" browser work like the "old" browser. So I'll just USE the "old"
AxWebBrowser in 2005. Solves all my problems, code will work, will have
RegisterAsBrowser. (Yes, someone on this group told me the browsers are
basically the same just "wrapped" differently.)

Dim ThisBrowser as New SHDocVw.AxWebBrowser

Only I can't declare a new browser as AxWebBrowser. I get an error of
AxWebBrowser ambigious in ShowDocVw namespace.

I have references to both Interop.SHDocVw and AxInerop.SHDocVw in my
project. But when I go into the form to do an Import, all I get is the
SHDocVw namespace with no ability to add on dots and sub namespaces.

What am I doing wrong? How can I do the right Imports and namespaces?
How can I declare a new instance of an AxWebBrowser?

This namespace stuff makes my head swim, actually. I am a fairly good
programmer, but some of this VB.Net stuff is too convoluted.

Any help appreciated as I stumble around in the dark.

Doe

Author
16 Mar 2006 8:50 PM
Colin Neller
> Okay, I've given up on using the "new" WebBrowser in 2005 to do what I
> want to do -- tabbed browsing. It seems I really need RegisterAsBrowser
> and Application to get each instance of a browser working on each tab
> (and those methods are not available in 2005).

I would recommend you try the 2005 WB again.  What you're trying to do
should pretty straight forward:

  Dim wb As IWebBrowser2 = DirectCast(Me.WebBrowser1.ActiveXInstance,
IWebBrowser2)
  wb.RegisterAsBrowser = True

The slightly tricky part would be defining IWebBrowser2... just do a search
on http://www.pinvoke.net/ and then just copy and paste.  You will need to
get the definitions to the following:

IWebBrowser2
OLECMDID
OLECMDEXCOPT
OLECMDF
tagREADYSTATE

Author
17 Mar 2006 1:04 PM
CMM
Hopefully this will get you started... my nice little webbrowser inherited
from VS2005's webbrowser to add missing functionality. You need to add a
reference to Microsoft Internet Controls COM object.

Imports System.Runtime.InteropServices

<StructLayout(LayoutKind.Sequential)> _
Friend Structure OLECMDTEXT
    Public cmdtextf As UInt32
    Public cwActual As UInt32
    Public cwBuf As UInt32
    Public rgwz As Char
End Structure

<StructLayout(LayoutKind.Sequential)> _
Friend Structure OLECMD
    Public cmdID As Long
    Public cmdf As UInt64
End Structure

' Interop definition for IOleCommandTarget.
<ComImport(), Guid("b722bccb-4e68-101b-a2bc-00aa00404770"),
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)> _
Friend Interface IOleCommandTarget
    ' IMPORTANT: The order of the methods is critical here. We're going to
    ' perform early binding in most cases, so the order of the methods
    ' here MUST match the order of their vtable layout (which is determined
    ' by their layout in IDL). The interop calls key off the vtable
ordering,
    ' not the symbolic names, so if you switched these method declarations
    ' and attempted to call Exec() on an IOleCommandTarget interface from
your
    ' app, it would translate into a call to QueryStatus() instead.
    Sub QueryStatus(ByRef pguidCmdGroup As Guid, ByVal cCmds As UInt32,
<MarshalAs(UnmanagedType.LPArray, SizeParamIndex:=1)> ByVal prgCmds As
OLECMD, ByRef pCmdText As OLECMDTEXT)
    Sub Exec(ByRef pguidCmdGroup As Guid, ByVal nCmdId As Long, ByVal
nCmdExecOpt As Long, ByRef pvaIn As Object, ByRef pvaOut As Object)
End Interface

''' <summary>
''' Inherited from .NET 2.0 Webbrowser to provide missing functionality.
''' </summary>
''' <remarks>Even the new .NET 2.0 Webbrowser doesn't implement a full
feature set... this class begins to solve that.</remarks>
Public Class EnhancedWebBrowser
    Inherits WebBrowser

    Private commandGuid As New Guid(&HED016940, -17061, &H11CF, &HBA, &H4E,
&H0, &HC0, &H4F, &HD7, &H8, &H16)

    Private Enum MiscCommandTarget
        Find = 1
        ViewSource = 2
    End Enum

    Private ReadOnly Property UnderlyingBrowser() As SHDocVw.WebBrowser

        Get
            Return CType(Me.ActiveXInstance, SHDocVw.WebBrowser)
        End Get

    End Property

    Public Function IsEditCutEnabled() As Boolean

        Dim result As SHDocVw.OLECMDF =
Me.UnderlyingBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_CUT)

        Return ((result And SHDocVw.OLECMDF.OLECMDF_ENABLED) =
SHDocVw.OLECMDF.OLECMDF_ENABLED)

    End Function

    Public Function IsEditCopyEnabled() As Boolean

        Dim result As SHDocVw.OLECMDF =
Me.UnderlyingBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_COPY)

        Return ((result And SHDocVw.OLECMDF.OLECMDF_ENABLED) =
SHDocVw.OLECMDF.OLECMDF_ENABLED)

    End Function

    Public Function IsEditPasteEnabled() As Boolean

        Dim result As SHDocVw.OLECMDF =
Me.UnderlyingBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_PASTE)

        Return ((result And SHDocVw.OLECMDF.OLECMDF_ENABLED) =
SHDocVw.OLECMDF.OLECMDF_ENABLED)

    End Function

    Public Function IsEditUndoEnabled() As Boolean

        Dim result As SHDocVw.OLECMDF =
Me.UnderlyingBrowser.QueryStatusWB(SHDocVw.OLECMDID.OLECMDID_UNDO)

        Return ((result And SHDocVw.OLECMDF.OLECMDF_ENABLED) =
SHDocVw.OLECMDF.OLECMDF_ENABLED)

    End Function

    Public Sub ExecEditCut()

        Me.UnderlyingBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_CUT,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)

    End Sub

    Public Sub ExecEditCopy()

        Me.UnderlyingBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_COPY,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)

    End Sub

    Public Sub ExecEditPaste()

        Me.UnderlyingBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_PASTE,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)

    End Sub

    Public Sub ExecEditUndo()

        Me.UnderlyingBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_UNDO,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DONTPROMPTUSER)

    End Sub

    Private Sub ExecOleCommandTarget(ByVal command As MiscCommandTarget)

        Dim commandTarget As IOleCommandTarget
        Dim obj As Object

        Try
            commandTarget = CType(Me.Document.DomDocument,
IOleCommandTarget)
            commandTarget.Exec(commandGuid, command,
SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_DODEFAULT, obj, obj)
        Catch
            Throw (New Exception(Err.GetException().Message))
        End Try

    End Sub

    Public Sub ShowFindDialog()

        ExecOleCommandTarget(MiscCommandTarget.Find)

    End Sub

    Public Sub ShowSource()

        ExecOleCommandTarget(MiscCommandTarget.ViewSource)

    End Sub

End Class





--
-C. Moya
www.cmoya.com
Show quoteHide quote
"Colin Neller" <cnel***@gmail.com> wrote in message
news:OonqjqTSGHA.5108@TK2MSFTNGP09.phx.gbl...
>> Okay, I've given up on using the "new" WebBrowser in 2005 to do what I
>> want to do -- tabbed browsing. It seems I really need RegisterAsBrowser
>> and Application to get each instance of a browser working on each tab
>> (and those methods are not available in 2005).
>
> I would recommend you try the 2005 WB again.  What you're trying to do
> should pretty straight forward:
>
>  Dim wb As IWebBrowser2 = DirectCast(Me.WebBrowser1.ActiveXInstance,
> IWebBrowser2)
>  wb.RegisterAsBrowser = True
>
> The slightly tricky part would be defining IWebBrowser2... just do a
> search on http://www.pinvoke.net/ and then just copy and paste.  You will
> need to get the definitions to the following:
>
> IWebBrowser2
> OLECMDID
> OLECMDEXCOPT
> OLECMDF
> tagREADYSTATE
>
> --
> Colin Neller
> http://www.colinneller.com/blog
>
Author
17 Mar 2006 2:43 PM
Doe
Thanks, Colin, I was wondering if a Direct Cast was possible. I have
found code for IWebBrowser2.

Thanks, C. Moya. Very nice, but I already have code for stuff like Find
and Copy/Paste in both 2003 and 2005. Need the RegisterAsBrowser. And
have already found those definitions for OLECMDTEXT and OLECMD. Need
the others that Colin mentioned.

Thanks for the replies, guys. Going to try Colin's suggest and see if
it works. Will report back. A Direct Cast just might do it.

Later, Doe
Author
17 Mar 2006 3:02 PM
CMM
You should have looked more closely. From within the inherited "extended"
WebBrowser class I posted...

Me.UnderlyingBrowser.RegisterAsBrowser = True

The code for "UnderlyingBrowser" is simply:

Public ReadOnly Property UnderlyingBrowser() As SHDocVw.WebBrowser

    Get
        Return CType(Me.ActiveXInstance, SHDocVw.WebBrowser)
    End Get

End Property


--
-C. Moya
www.cmoya.com
Show quoteHide quote
"Doe" <doeade***@aol.com> wrote in message
news:1142606629.667008.236350@u72g2000cwu.googlegroups.com...
> Thanks, Colin, I was wondering if a Direct Cast was possible. I have
> found code for IWebBrowser2.
>
> Thanks, C. Moya. Very nice, but I already have code for stuff like Find
> and Copy/Paste in both 2003 and 2005. Need the RegisterAsBrowser. And
> have already found those definitions for OLECMDTEXT and OLECMD. Need
> the others that Colin mentioned.
>
> Thanks for the replies, guys. Going to try Colin's suggest and see if
> it works. Will report back. A Direct Cast just might do it.
>
> Later, Doe
>
Author
17 Mar 2006 3:08 PM
CMM
Clarification to previous post (read it first):
Actually I made UnderlyingBrowser private to the class... you can easily
make it public and expose it or make a new wrapper property for
RegisterAsBrowser as so:

Public Property RegisterAsBrowser() As Boolean
    Get
        Return Me.UnderlyingBrowser.RegisterAsBrowser
    End Get
    Set(ByVal value As Boolean)
        Me.UnderlyingBrowser.RegisterAsBrowser = value
    End Set
End Property


--
-C. Moya
www.cmoya.com
Show quoteHide quote
"CMM" <cmm@nospam.com> wrote in message
news:OFe7TPdSGHA.1948@TK2MSFTNGP09.phx.gbl...
> You should have looked more closely. From within the inherited "extended"
> WebBrowser class I posted...
>
> Me.UnderlyingBrowser.RegisterAsBrowser = True
>
> The code for "UnderlyingBrowser" is simply:
>
> Public ReadOnly Property UnderlyingBrowser() As SHDocVw.WebBrowser
>
>    Get
>        Return CType(Me.ActiveXInstance, SHDocVw.WebBrowser)
>    End Get
>
> End Property
>
>
> --
> -C. Moya
> www.cmoya.com
> "Doe" <doeade***@aol.com> wrote in message
> news:1142606629.667008.236350@u72g2000cwu.googlegroups.com...
>> Thanks, Colin, I was wondering if a Direct Cast was possible. I have
>> found code for IWebBrowser2.
>>
>> Thanks, C. Moya. Very nice, but I already have code for stuff like Find
>> and Copy/Paste in both 2003 and 2005. Need the RegisterAsBrowser. And
>> have already found those definitions for OLECMDTEXT and OLECMD. Need
>> the others that Colin mentioned.
>>
>> Thanks for the replies, guys. Going to try Colin's suggest and see if
>> it works. Will report back. A Direct Cast just might do it.
>>
>> Later, Doe
>>
>
>
Author
17 Mar 2006 3:09 PM
Doe
Cool.

Doe