Using AxWebBrowser in VB 2005

D

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
 
C

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
 
C

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
 
D

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
 
C

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

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
 
D

Doe

Okay, there is something I am not understanding here. I finally got
around to testing this. When I try it, calling RegisterAsBrowser, I get
an error message -- must use new keyword.

I am doing:
Dim ThisBrowser As EnhancedWebBrowser

ThisBrowser = New EnhancedWebBrowser
ThisBrowser.UnderlyingBrowser.RegisterAsBrowser = True

But somehow there must also be a New required for the Underlying
Browser, to create a new instance.

Right? Should that be put in the Class, Public Sub New?

Sigh. Sorry to be such a dunce.

Doe
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top