• Welcome to Theos PowerBasic Museum 2017.

News:

Attachments are only available to registered users.
Please register using your full, real name.

Main Menu

Method BeforeNavigate2 <250>

Started by Stan Duraham, June 12, 2010, 08:41:06 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Stan Duraham

EX_OC_WB_IDocHostUIHandler2.BAS

how do I get vURL as a string?



   Method BeforeNavigate2 <250> ( _
     ByVal pDisp As IDispatch _                         ' __in IDispatch* pDisp
   , ByRef vURL As Variant _                            ' __in VARIANT* URL
   , ByRef vFlags As Variant _                          ' __in VARIANT* Flags
   , ByRef vTargetFrameName As Variant _                ' __in VARIANT* TargetFrameName
   , ByRef vPostData As Variant _                       ' __in VARIANT* PostData
   , ByRef vHeaders As Variant _                        ' __in VARIANT* Headers
   , ByRef bCancel As Integer _                         ' __in_out VARIANT_BOOL* Cancel
   )                                                    ' void

     ' *** Insert your code here ***
     ? Variant$(vURL)
   End Method

José Roca

Easy:


DIM strlUrl AS STRING
strUrl = VARIANT$(vURL)



Stan Duraham

thanks José and Edwin
and thanks José for all your work

9.04
It does return a null string.

I did find this;
Quote
The url argument contains the URL that is being navigated to. It is the fifth argument from last (the last one being the 0th), so we access it as pDispParams->rgvarg[5]. We convert this variant to a variant type of VT_BSTR as it may not be in that format, and store the converted variant into v[0]. We can then access the URL as a BSTR string by using v[0].bstrVal. A BSTR string is commonly used in COM to pass string data. It consists of a 4-byte prefix indicating the length of the string, followed by the string data as a double-byte character NULL-terminated Unicode string. A BSTR variable always points to the string data, and not to the 4-byte prefix before it, which conveniently allows us to use it as a C-style string. A double-byte character string type is declared in the Windows API headers as LPOLESTR, regardless of whether the program is using the wide-character set by default. So, we can pass the string v[0].bstrVal as an LPOLESTR parameter to the Event_BeforeNavigate2 event-handling method.

How to access the url argument

Collapse Copy CodeVariantChangeType(&v[0],&pDispParams->rgvarg[5],0,VT_BSTR);
// make sure the argument is of variant type VT_BSTR

...
Event_BeforeNavigate2( (LPOLESTR) v[0].bstrVal , ... );
// pass the url argument to the event handler
http://www.codeproject.com/KB/shell/BHOinCPP.aspx


José Roca

Quote
9.04
It does return a null string.

It seems that there is a problem with BYREF VARIANT parameters in version 9.04.

José Roca

#5
Quote
I did find this;

As a workaround, we can also use a PB class for events sink if we INHERIT from IUnknown, remove the DispIDs, implement the four methods of the IDispatch interface, and do the packing/unpacking of the parameters by ourselves.

Note: The attached file contains the complete code.


' ########################################################################################
' Class CDWebBrowserEvents2
' Interface name = DWebBrowserEvents2
' IID = {34A715A0-6587-11D0-924A-0020AFC7AC4D}
' Web Browser Control events interface
' Attributes = 4112 [&H1010] [Hidden] [Dispatchable]
' ########################################################################################

CLASS CDWebBrowserEvents2 GUID$("{700B73A2-CCFC-4FE0-B9AC-D5853D71B7B9}")

INTERFACE DWebBrowserEvents2Impl GUID$("{34A715A0-6587-11D0-924A-0020AFC7AC4D}")

 INHERIT IUnknown


  ' =====================================================================================
  METHOD GetTypeInfoCount (BYREF pctInfo AS DWORD)
     OutputDebugString FUNCNAME$
     pctInfo = 0
  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD GetTypeInfo (BYVAL itinfo AS DWORD, BYVAL lcid AS DWORD, BYREF pptinfo AS DWORD)
     OutputDebugString FUNCNAME$
  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD GetIDsOfNames (BYREF riid AS GUID, BYREF rgszNames AS STRING, BYVAL cNames AS DWORD, BYVAL lcid AS DWORD, BYREF rgdispid AS LONG)
     OutputDebugString FUNCNAME$
  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD Invoke (BYVAL dispidMember AS LONG, BYREF riid AS GUID, _
                 BYVAL lcid AS DWORD, BYVAL wFlags AS WORD, BYREF pdispparams AS DISPPARAMS, BYREF pvarResult AS VARIANT, _
                 BYVAL pexcepinfo AS DWORD, BYREF puArgErr AS DWORD)
 
     LOCAL i AS LONG
     LOCAL pv AS VARIANT PTR
     LOCAL pvapi AS tagVARIANT PTR

     pv = pDispParams.VariantArgs
     pvapi = pDispParams.VariantArgs

     LOCAL pDisp AS IDispatch
     LOCAL vURL, vFlags, vTargetFrameName, vPostData, vHeaders AS VARIANT
     LOCAL bCancel AS INTEGER
     LOCAL CX, CY AS LONG
     LOCAL vFrame, vStatusCode AS VARIANT
     LOCAL vPage, vDone AS VARIANT

     OutputDebugString FUNCNAME$ & STR$(dispidMember)

     SELECT CASE AS LONG dispidMember
        CASE 102   ' // StatusTextChange
           ME.StatusTextChange(UCODE$(VARIANT$(@pv[0])))
        CASE 108   ' // ProgressChange
           ME.ProgressChange(VARIANT#(@pv[1]), VARIANT#(@pv[0]))
        CASE 105   ' // CommandStateChange
           ME.ProgressChange(VARIANT#(@pv[1]), VARIANT#(@pv[0]))
        CASE 106   ' // DownloadBegin
           ME.DownloadBegin
        CASE 104   ' // DownloadComplete
           ME.DownloadComplete
        CASE 113   ' // TitleChange
           ME.TitleChange(UCODE$(VARIANT$(@pv[0])))
        CASE 112   ' // PropertyChange
           ME.PropertyChange(UCODE$(VARIANT$(@pv[0])))
        CASE 250   ' // BeforeNavigate2
           pDisp = @pv[6]
           vURL = @pv[5]
           vFlags = @pv[4]
           vTargetFrameName = @pv[3]
           vPostData = @pv[2]
           vHeaders = @pv[1]
           bCancel = VARIANT#(@pv[0])
           ME.BeforeNavigate2(pDisp, vURL, vFlags, vTargetFrameName, vPostData, vHeaders, bCancel)
           @pvapi[0].@pboolVal = bCancel
           pDisp = NOTHING
        CASE 251   ' // NewWindow2
           pDisp = @pv[1]
           bCancel = VARIANT#(@pv[0])
           ME.NewWindow2(pDisp, bCancel)
           @pvapi[0].@pboolVal = bCancel
        CASE 252   ' // NavigateComplete2
           pDisp = @pv[1]
           vURL = @pv[0]
           ME.NavigateComplete2(pDisp, vURL)
        CASE 259   ' // DocumentComplete
           pDisp = @pv[1]
           vURL = @pv[0]
           ME.DocumentComplete(pDisp, vURL)
           pDisp = NOTHING
        CASE 253   ' // OnQuit
           ME.OnQuit
        CASE 254   ' // OnVisible
           ME.OnVisible(VARIANT#(@pv[0]))
        CASE 255   ' // OnToolBar
           ME.OnToolBar(VARIANT#(@pv[0]))
        CASE 256   ' // OnMenuBar
           ME.OnMenuBar(VARIANT#(@pv[0]))
        CASE 257   ' // OnStatusBar
           ME.OnStatusBar(VARIANT#(@pv[0]))
        CASE 258   ' // OnFullScree
           ME.OnFullScreen(VARIANT#(@pv[0]))
        CASE 260   ' // OnTheaterMode
           ME.OnTheaterMode(VARIANT#(@pv[0]))
        CASE 262   ' // WindowSetResizable
           ME.WindowSetResizable(VARIANT#(@pv[0]))
        CASE 264   ' // WindowSetLeft
           ME.WindowSetLeft(VARIANT#(@pv[0]))
        CASE 265   ' // WindowSetTop
           ME.WindowSetTop(VARIANT#(@pv[0]))
        CASE 266   ' // WindowSetWidth
           ME.WindowSetWidth(VARIANT#(@pv[0]))
        CASE 267   ' // WindowSetHeight
           ME.WindowSetHeight(VARIANT#(@pv[0]))
        CASE 263   ' // WindowClosing
           bCancel = VARIANT#(@pv[0])
           ME.WindowClosing(bCancel, VARIANT#(@pv[0]))
           @pvapi[0].@pboolVal = bCancel
        CASE 268   ' // ClientToHostWindow
           CX = VARIANT#(@pv[1])
           CY = VARIANT#(@pv[0])
           ME.ClientToHostWindow(CX, CY)
           @pvapi[1].@plVal = CX
           @pvapi[0].@plVal = CY
        CASE 269   ' // SetSecureLockIcon
           ME.SetSecureLockIcon(VARIANT#(@pv[0]))
        CASE 270   ' // FileDownload
           bCancel = VARIANT#(@pv[0])
           ME.FileDownload(VARIANT#(@pv[0]), bCancel)
           @pvapi[0].@pboolVal = bCancel
        CASE 271   ' // NavigateError
           pDisp = @pv[4]
           vURL = @pv[3]
           vFrame = @pv[2]
           vStatusCode = @pv[1]
           bCancel = VARIANT#(@pv[0])
           ME.NavigateError(pDisp, vURL, vFrame, vStatusCode, bCancel)
           @pvapi[0].@pboolVal = bCancel
           pDisp = NOTHING
        CASE 225   ' // PrintTemplateInstantiation
           pDisp = @pv[0]
           ME.PrintTemplateInstantiation(pDisp)
           pDisp = NOTHING
        CASE 226   ' // PrintTemplateTeardown
           pDisp = @pv[0]
           ME.PrintTemplateTeardown(pDisp)
           pDisp = NOTHING
        CASE 227   ' // UpdatePageStatus
           pDisp = @pv[2]
           vPage = @pv[1]
           vDone = @pv[0]
           ME.UpdatePageStatus(pDisp, vPage, vDone)
           pDisp = NOTHING
        CASE 272   ' // PrivacyImpactedStateChange
           ME.PrivacyImpactedStateChange(VARIANT#(@pv[0]))
        CASE 273   ' // NewWindow3
           pDisp = @pv[4]
           bCancel = VARIANT#(@pv[3])
           ME.NewWindow3(pDisp, bCancel, VARIANT#(@pv[2]), UCODE$(VARIANT$(@pv[1])), UCODE$(VARIANT$(@pv[0])))
           @pvapi[3].@pboolVal = bCancel
           pDisp = NOTHING
        CASE 282   ' // SetPhishingFilterStatus
           ME.SetPhishingFilterStatus(VARIANT#(@pv[0]))
        CASE 283   ' // WindowStateChanged
           ME.WindowStateChanged(VARIANT#(@pv[1]), VARIANT#(@pv[0]))
    END SELECT

  END METHOD
  ' =====================================================================================


  ' =====================================================================================
  METHOD StatusTextChange ( _
    BYVAL strText AS STRING _                          ' __in BSTR Text
  )                                                    ' void

    ' *** Insert your code here ***
    OutputDebugString(ACODE$(strText))

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD ProgressChange ( _
    BYVAL Progress AS LONG _                           ' __in long Progress
  , BYVAL ProgressMax AS LONG _                        ' __in long ProgressMax
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD CommandStateChange ( _
    BYVAL nCommand AS LONG _                           ' __in long Command
  , BYVAL bEnable AS INTEGER _                         ' __in VARIANT_BOOL Enable
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD DownloadBegin

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD DownloadComplete

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD TitleChange ( _
    BYVAL strText AS STRING _                          ' __in BSTR Text
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD PropertyChange ( _
    BYVAL strProperty AS STRING _                      ' __in BSTR szProperty
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD BeforeNavigate2 ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  , BYREF vURL AS VARIANT _                            ' __in VARIANT* URL
  , BYREF vFlags AS VARIANT _                          ' __in VARIANT* Flags
  , BYREF vTargetFrameName AS VARIANT _                ' __in VARIANT* TargetFrameName
  , BYREF vPostData AS VARIANT _                       ' __in VARIANT* PostData
  , BYREF vHeaders AS VARIANT _                        ' __in VARIANT* Headers
  , BYREF bCancel AS INTEGER _                         ' __in_out VARIANT_BOOL* Cancel
  )                                                    ' void

    ' *** Insert your code here ***
    ? VARIANT$(vUrl)

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD NewWindow2 ( _
    BYREF ppDisp AS IDispatch _                        ' __in_out IDispatch** ppDisp
  , BYREF bCancel AS INTEGER _                         ' __in_out VARIANT_BOOL* Cancel
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD NavigateComplete2 ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  , BYREF vURL AS VARIANT _                            ' __in VARIANT* URL
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD DocumentComplete ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  , BYREF vURL AS VARIANT _                            ' __in VARIANT* URL
  )                                                    ' void

     ' After the MSHTML document has been loaded we retrieve a reference to his
     ' ICustomDoc interface and give him a pointer to our IDocHostUIHandler interface
     ' to allow for customization.

     LOCAL pIWebBrowser2 AS IWebBrowser2
     LOCAL pIHTMLDocument2 AS IHTMLDocument2
     LOCAL pICustomDoc AS ICustomDoc
     LOCAL pDocHostUIHandler AS IDocHostUIHandler2Impl

     pIWebBrowser2 = pDisp
     IF ISNOTHING(pIWebBrowser2) THEN EXIT METHOD

     ' Get a reference to the active document
     pIHTMLDocument2 = pIWebBrowser2.Document
     IF ISNOTHING(pIHTMLDocument2) THEN EXIT METHOD

     ' Get a reference to the CustomDoc interface
     pICustomDoc = pIHTMLDocument2
     IF ISNOTHING(pICustomDoc) THEN EXIT METHOD

     ' Set our IDocHostUIHandler interface for MSHTML
     ' MSHTML will release its previous IDocHostUIHandler interface
     ' (if one is present) and call pDocHostUIHandler's AddRef method.
     pDocHostUIHandler = CLASS "CDocHostUIHandler2"
     IF ISOBJECT(pDocHostUIHandler) THEN
        pICustomDoc.SetUIHandler(pDocHostUIHandler)
     END IF

     ' Release the interfaces
     pDocHostUIHandler = NOTHING
     pICustomDoc = NOTHING
     pIWebBrowser2 = NOTHING

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnQuit

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnVisible ( _
    BYVAL bVisible AS INTEGER _                        ' __in VARIANT_BOOL Visible
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnToolBar ( _
    BYVAL bToolBar AS INTEGER _                        ' __in VARIANT_BOOL ToolBar
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnMenuBar ( _
    BYVAL bMenuBar AS INTEGER _                        ' __in VARIANT_BOOL MenuBar
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnStatusBar ( _
    BYVAL bStatusBar AS INTEGER _                      ' __in VARIANT_BOOL StatusBar
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnFullScreen ( _
    BYVAL bFullScreen AS INTEGER _                     ' __in VARIANT_BOOL FullScreen
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD OnTheaterMode ( _
    BYVAL bTheaterMode AS INTEGER _                    ' __in VARIANT_BOOL TheaterMode
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowSetResizable ( _
    BYVAL bResizable AS INTEGER _                      ' __in VARIANT_BOOL Resizable
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowSetLeft ( _
    BYVAL nLeft AS LONG _                              ' __in long Left
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowSetTop ( _
    BYVAL Top AS LONG _                                ' __in long Top
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowSetWidth ( _
    BYVAL nWidth AS LONG _                             ' __in long Width
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowSetHeight ( _
    BYVAL Height AS LONG _                             ' __in long Height
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowClosing ( _
    BYVAL IsChildWindow AS INTEGER _                   ' __in VARIANT_BOOL IsChildWindow
  , BYREF bCancel AS INTEGER _                         ' __in_out VARIANT_BOOL* Cancel
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD ClientToHostWindow ( _
    BYREF CX AS LONG _                                 ' __in_out long* CX
  , BYREF CY AS LONG _                                 ' __in_out long* CY
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD SetSecureLockIcon ( _
    BYVAL SecureLockIcon AS LONG _                     ' __in SecureLockIcon /* VT_I4 <Long> */
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD FileDownload ( _
    BYVAL bActiveDocument AS INTEGER _                 ' __in     VARIANT_BOOL ActiveDocument
  , BYREF Cancel AS INTEGER _                          ' __in_out VARIANT_BOOL* Cancel
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD NavigateError ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  , BYREF vURL AS VARIANT _                            ' __in VARIANT* URL
  , BYREF vFrame AS VARIANT _                          ' __in VARIANT* Frame
  , BYREF vStatusCode AS VARIANT _                     ' __in VARIANT* StatusCode
  , BYREF bCancel AS INTEGER _                         ' __in_out VARIANT* Cancel
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD PrintTemplateInstantiation ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD PrintTemplateTeardown ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD UpdatePageStatus ( _
    BYVAL pDisp AS IDispatch _                         ' __in IDispatch* pDisp
  , BYREF nPage AS VARIANT _                           ' __in VARIANT* nPage
  , BYREF fDone AS VARIANT _                           ' __in VARIANT* fDone
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD PrivacyImpactedStateChange ( _
    BYVAL bImpacted AS INTEGER _                       ' __in VARIANT_BOOL bImpacted
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD NewWindow3 ( _
    BYREF ppDisp AS IDispatch _                        ' __in_out IDispatch** ppDisp
  , BYREF bCancel AS INTEGER _                         ' __in_out VARIANT_BOOL* Cancel
  , BYVAL dwFlags AS DWORD _                           ' __in unsigned long dwFlags
  , BYVAL bstrUrlContext AS STRING _                   ' __in BSTR bstrUrlContext
  , BYVAL bstrUrl AS STRING _                          ' __in BSTR bstrUrl
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD SetPhishingFilterStatus ( _
    BYVAL PhishingFilterStatus AS LONG _               ' __in long PhishingFilterStatus
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

  ' =====================================================================================
  METHOD WindowStateChanged ( _
    BYVAL dwWindowStateFlags AS DWORD _                ' __in unsigned long dwWindowStateFlags
  , BYVAL dwValidFlagsMask AS DWORD _                  ' __in unsigned long dwValidFlagsMask
  )                                                    ' void

    ' *** Insert your code here ***

  END METHOD
  ' =====================================================================================

END INTERFACE

END CLASS


Stan Duraham

this works


   Method BeforeNavigate2 <250> ( _
     ByVal pDisp As IDispatch _                         ' __in IDispatch* pDisp
   , ByRef vURL As String _ '!!!!!!!!!!!!! Variant _                            ' __in VARIANT* URL
   , ByRef vFlags As Variant _                          ' __in VARIANT* Flags
   , ByRef vTargetFrameName As Variant _                ' __in VARIANT* TargetFrameName
   , ByRef vPostData As Variant _                       ' __in VARIANT* PostData
   , ByRef vHeaders As Variant _                        ' __in VARIANT* Headers
   , ByRef bCancel As Integer _                         ' __in_out VARIANT_BOOL* Cancel
   )                                                    ' void

     ' *** Insert your code here ***
     
     ? ACode$(vURL)

   End Method


José Roca

 
Should not. Remember to check your code when a new update will be released. Probably it won't work then.

Stan Duraham

http://msdn.microsoft.com/en-us/library/aa768326(VS.85).aspx
"BeforeNavigate2 Event (InternetExplorer, WebBrowser)"
ByRef Url As Variant, _
Url: String expression that evaluates to the URL to which the browser is navigating.


http://msdn.microsoft.com/en-us/library/aa768280(VS.85).aspx
"BeforeNavigate2 Event (DWebBrowserEvents2)"
VARIANT *url,
url: [in] A pointer to a VARIANT structure of type VT_BSTR that contains the URL to navigate to.

in the second reference, it is a BSTR ptr
that's correct for: ByRef url as String

the first reference is for Visual Basic
the second reference is for C++

as implemented now, it's compatible with C++
I'm guessing that VB has a wrapper around the C++ code