Geoff Chappell - Software Analyst
The original IUserAssist methods are (as ordered in the virtual function table after the IUnknown methods):
HRESULT FireEvent (GUID const *, INT, ULONG, WPARAM, LPARAM);
HRESULT QueryEvent (GUID const *, INT, WPARAM, LPARAM, UEMINFO *);
HRESULT SetEvent (GUID const *, INT, WPARAM, LPARAM, UEMINFO *);
in which UEMINFO is an undocumented structure.
The revision adds one method:
It has the prototype:
HRESULT Enable (BOOL);
The only known implementation is in BROWSEUI.DLL (reproduced in IEFRAME.DLL in Windows Vista) for the UserAssist class. Instances are creatable through the following CLSID:
As actually implemented, creating an instance through COM just obtains access to a single instance which is shared among all clients.
The IUserAssist interface is implemented in BROWSEUI.DLL version 5.0 and higher, and in IEFRAME.DLL version 7.0 and higher. The revision begins with the BROWSEUI version 6.0 from Windows Vista and with IEFRAME.
Though this interface dates from as long ago as 1999, it was still not documented by Microsoft as late as the January 2004 edition of the MSDN Library on CD.
Since Microsoft feels free to change the IID and methods for IUserAssist without changing the name, the suggestion is strong that Microsoft regards this interface as internal. But internal to what? The first implementation is in BROWSEUI from Internet Explorer 5.0 and the first use is by SHDOCVW from that version. Yet beginning with Windows 2000, the interface is also used by the Windows Explorer to maintain the list of recently opened programs on the simple Start Menu, i.e., for purposes that have nothing to do with the Internet. So, is IUserAssist a Windows interface used by Internet Explorer or an Internet Explorer interface used by Windows? Windows Vista separates the uses for the Windows Explorer and Internet Explorer, one into BROWSEUI and the other into IEFRAME, with a different CLSID for each (though with the one symbol for both).