MORE INFORMATION
Install DLLList
The following file is available for download from the Microsoft Download Center:
Release Date: January 9, 2001
For additional information about how to download Microsoft Support files, click the following article number to view the article in the Microsoft Knowledge Base:
119591 How to Obtain Microsoft Support Files from Online Services
Microsoft scanned this file for viruses. Microsoft used the most current virus-detection software that was available on the date that the file was posted. The file is stored on security-enhanced servers that help to prevent any unauthorized changes to the file.
Run DLLList
- Compile the application under Microsoft Visual C++ 6.0.
- Make sure that you download the Internet Explorer 5.5 headers and libraries and that they are placed in the Include search path. The Internet Explorer 5.5 headers and libraries are part of the current Platform Software Development Kit (SDK), which you can download from the Microsoft Download Center:
- Place the DllDisplayFormat.xsl and Test.htm files in the same folder on a Web server.
NOTE: The XSL file does not load properly if you try to run this sample from the filesystem. - In Internet Explorer 5.5, launch the Test.htm page that is included with the project.
DLLList Details
DLLList demonstrates the following aspects of element behaviors:
Required Interfaces for an Element Behavior
The following interfaces are required for an element behavior:
IObjectWithSite,
IElementBehavior,
IElementBehaviorFactory, and
IElementNamespaceFactory. DLLList implements these interfaces. For more information on the implementation of these interfaces, see the following Microsoft Developer Network (MSDN) Web site:
Passing Data as Literal Content
Element behaviors are used on a page like HTML tags. An element behavior can activate literal content to tell Internet Explorer not to parse anything between the behavior's opening and closing tags, but to pass this content directly to the element behavior for parsing. This feature is activated inside the behavior's implementation of the
IElementNamespaceFactory::Create method, where the
IElementNamespace::AddTag method is called with the
ELEMENTDESCRIPTORFLAGS_LITERAL parameter as follows:
STDMETHODIMP CDllList::Create(IElementNamespace *pNamespace) {
HRESULT hr = S_OK;
BSTR tagName = ::SysAllocString(L"DllList");
hr = pNamespace->AddTag(tagName, ELEMENTDESCRIPTORFLAGS_LITERAL);
::SysFreeString(tagName);
return hr;
}
Literal content, when used in conjunction with XML, is an excellent way to pass non-scalar parameters to an element behavior. In Test.htm, the component is instantiated as follows:
<CustomComponents:DllList id="np1" templateUrl="http://Your Server/template.htm"
xsl="http://Your Server/dllDisplayFormat.xsl" displayElement="div1">
<DllList>
<Dll>shdocvw.dll</Dll>
<Dll>mshtml.dll</Dll>
<Dll>wininet.dll</Dll>
<Dll>ahjskja.ocx</Dll>
<Dll>urlmon.dll</Dll>
<Dll>comctl32.ocx</Dll>
<Dll>comcat.dll</Dll>
</DllList>
</CustomComponents:DllList>
Everything between the <CustomComponents:DllList> tags is actually a small XML file, which is loaded into an instance of the Microsoft XML Parser (MSXML) in the
CDllList::AddVersionDataXML method. Then the behavior uses XML interfaces to iterate through the list of <Dll> tags and extract each DLL name one at a time so that
CDllList::AddVersionData can look up the version information.
Passing Data as Tag Attributes
Look at our <CustomComponent:DllList> tag again: it contains a series of custom attributes that specify various scalar parameters for the behavior. Whenever Internet Explorer notices attributes on the tag of a binary element behavior, it queries the behavior for the
IPersistPropertyBag interface and calls the
Load method (just as Internet Explorer does for ActiveX controls and <PARAM> tags). This allows the behavior to initialize publicly exposed properties.
Incorporating a Viewlink
Element Behaviors can choose to incorporate a Viewlink, which is an HTML document that acts as the visible representation of the control. Viewlinks have many advantages, including globalization, which uses Element Behaviors to allow Web developers to use Internet Explorer's excellent globalization support to display text in almost any language.
DLLList loads a very simple Viewlink named Template.htm, which contains an empty DIV element. DLLList uses the new
IHTMLDocument4::createDocumentFromUrl method to load this document in
CDllList::Notify. After it has a valid document pointer, it can get a reference to the component's
IHTMLElementDefaults interface from the component's site (specifically, from the
IElementBehaviorSiteOM2 interface) and call the
putref_viewLink method to set the Viewlink.
All documents that are loaded by MSHTML load asynchronously, including the documents that are returned by
createDocumentFromUrl. To prevent the element behavior from accessing elements in its Viewlink before the Viewlink has fully loaded, you can call the Viewlink's
IHTMLDocument2::get_parentWindow method and call the
IHTMLWindow2::put_onload method to pass the
IDispatch interface of
COnLoadHandler.
COnLoadHandler waits for a DISPID of 0 (the DISPID that is used by all of the
IHTMLDocument2::put_* methods to indicate that the event has been fired by Internet Explorer) and then calls a method on a private callback interface that is defined on our behavior's main class, CDllList. This callback,
IDllListCallback::CompleteStartup, can then call the methods that populate the empty DIV on the Viewlink with a list of DLLs and their versions.
Using XSL to Separate Display and Functionality
How do you call out the code that is used to display custom data inside the Viewlink so that you can change the appearance of the data without having to recompile the element behavior? This is one of the hardest practical questions to answer when you write a binary element behavior. Once again, you can use XML to resolve this.
When the
IDllListCallback::CompleteStartup function is called, it calls another function,
CDllList::AddVersionDataXML, which iterates through the list of DLLs that is provided in the literal content and, in conjunction with
CDllList::AddVersionData, creates another XML file in the following format:
<DllList>
<Dll Name="shdocvw.dll" Debug="Yes" PrivateBuild="Yes">
<FileVersion>5.50.4936.0400</FileVersion>
<ProductVersion>5.50.4936.0400</ProductVersion>
<FileType>DLL</FileType>
</Dll>
...
</DllList>
This XML file is used in conjunction with the XSL argument of the <CustomComponent:DllList> HTML tag to perform a
transformNode on this XML file, which results in formatted HTML that can be assigned to the empty DIV inside our Viewlink. Therefore, to change the appearance of the DLL version data, you only have to change the XSL file that is used in the transform; you do not have to recompile the component.