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
Easy:
DIM strlUrl AS STRING
strUrl = VARIANT$(vURL)
Check this out:
http://www.jose.it-berater.org/smfforum/index.php?topic=3443.0
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
Quote
9.04
It does return a null string.
It seems that there is a problem with BYREF VARIANT parameters in version 9.04.
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
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
Should not. Remember to check your code when a new update will be released. Probably it won't work then.
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