Geoff Chappell - Software Analyst
This interface has implementations in both IEFRAME and MSHTML. It seems new to Windows Vista, though closer inspection may reveal it or something similar in some other module in an earlier Windows version. The IID is:
INavigationTarget | {63724961-8034-46B5-B21B-83F574313308} |
This interface is not completely undocumented. It doesn’t get even a declaration in any Windows SDK header, but the corresponding IID_INavigationTarget is defined in the UUID.LIB library.
The INavigationTarget methods are:
Offset | Method |
---|---|
0x0C | GoBack |
0x10 | GoForward |
0x14 | Stop |
0x18 | Refresh |
0x1C | NavigateToUrl |
0x20 | NavigateToPidl |
0x24 | NavigateToShortcut |
0x28 | PopulateTravelLog |
0x2C | NavigateTravelLog |
0x30 | GetPidl |
0x34 | GetNavItemTitle |
0x38 | RestoreFrame |
The following are known from Microsoft’s symbol files:
HRESULT GoBack (VOID);
HRESULT GoForward (VOID);
HRESULT Stop (VOID);
HRESULT Refresh (LONG);
HRESULT NavigateToUrl (PCWSTR, LONG);
HRESULT NavigateToPidl (PCIDLIST_ABSOLUTE, LONG);
HRESULT NavigateToShortcut (PCWSTR, LONG);
HRESULT PopulateTravelLog (ITravelLogUI *);
HRESULT NavigateTravelLog (LONG);
HRESULT GetPidl (PIDLIST_ABSOLUTE *);
HRESULT GetNavItemTitle (LONG, PWSTR, ULONG);
HRESULT RestoreFrame (VOID);
It is not entirely inevitable, but the ITravelLogUI interface is also undocumented.
The implementation in MSHTML is very nearly trivial, with all but one method (GetPidl) returning E_NOTIMPL.
The implementation in IEFRAME is from a library, identified by Microsoft’s symbol files as STOCK_IE.LIB. It reinterprets most of the INavigationTarget methods in terms of other interfaces reached through a service provider. It is at least odd that some of these other interfaces are deprecated, according to the SDK.
The GoBack, GoForward, Stop, Refresh, NavigateToUrl and NavigateToPidl methods query the provider’s IWebBrowserApp service for its IWebBrowser2 interface. Translation of GoBack, GoForward and Stop to the IWebBrowser2 methods that have the same name is straightforward. The Refresh method translates to Refresh2.
The NavigateToUrl and NavigateToPidl methods both translate to Navigate2. The second argument is ignored for NavigateToUrl, but NavigateToPidl translates its second argument for the Flags argument of Navigate2.
The NavigateToShortcut and GetPidl methods query the provider’s IShellBrowser service for its (deprecated) IBrowserService interface. Translation of GetPidl to the IBrowserService method that has the same name is trivial. The handling of NavigateToShortcut is unusual and beyond the immediate scope of these quick notes.
The PopulateTravelLog, NavigateTravelLog and GetNavItemTitle methods need access to the travel log. They all get this through the GetTravelLog method of the IBrowserService interface to the provider’s IShellBrowser service. This method represents the travel log through an ITravelLog interface (also deprecated). One translation expects that the travel log will also have the ITravelLog2 interface (which is undocumented).
The PopulateTravelLog method translates to the PopulateTravelLogUI method of the travel log’s ITravelLog2 interface, passing as arguments the address of the IBrowserService interface, the given address of the ITravelLogUI interface and then 0x01, 0x13 and 0x33. (The first two are a range of menu IDs. The last is a set of bit flags, specifically to have the travel-log menu show forward, back and current entries.)
Translation of NavigateTravelLog to the ITravelLog interface’s Travel method is straightforward except that the iOffset argument for Travel is obtained from the LONG argument of NavigateTravelLog by subtracting 10. (It seems that NavigateTravelLog works with menu IDs.)
The GetNavItemTitle method translates less straightforwardly. The first argument is 1 for the next entry, 2 for the previous entry, else defaults to the current entry. The second and third arguments are respectively the address and size of a buffer that is to receive the selected entry’s title. Access to the selected entry is obtained through the GetTravelEntry method of the travel log’s ITravelLog interface. This method represents the travel log entry through an ITravelEntry interface (which is deprecated). The translation expects that the entry will also have an ITravelLogEntry interface. The title then comes from this interface’s GetTitle method.