<html>

<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>ATL Object Wizard</title>
</head>

<body bgcolor="#FFFFFF">

<p><font size="2">All wizard directives are enclosed in
[!&#133;].</font></p>

<p><font size="2"><b>SYMBOLS</b> are denoted in uppercase.</font></p>

<p><font size="2">The wizard is case sensitive.</font></p>

<p><font size="2">The arguments to the wizard directives should
be between ( ).</font></p>

<p><font size="4"><b><u>Wizard Directives.</u></b></font></p>

<p><font size="2"><b>SYMBOL</b></font></p>

<blockquote>
    <p><font size="2">Replaces the symbol with the value of the
    symbol.</font></p>
</blockquote>

<p><font size="2"><b>if(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Wizard ignores whatever is after this
    statement till it finds an <b>else</b> or <b>endif</b>
    directive if it does not find the symbol in its map. It does
    not care for the value of the symbol.</font></p>
</blockquote>

<p><font size="2"><b>if!(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Wizard ignores whatever is after this
    statement till it finds an <b>else</b> or <b>endif</b>
    directive if it finds the symbol in its map. It does not care
    for the value of the symbol.</font></p>
</blockquote>

<p><font size="2"><b>if=(SYMBOL, &quot;</b><b><i>value&quot;</i></b><b>)</b></font></p>

<blockquote>
    <p><font size="2">Wizard performs the directives after this
    statement till it finds an <b>else</b> or <b>endif</b>
    directive only if the value of the symbol matches the string.</font></p>
</blockquote>

<p><font size="2"><b>if!=(SYMBOL, &quot;</b><b><i>value&quot;</i></b><b>)</b></font></p>

<blockquote>
    <p><font size="2">Wizard performs the directives after this
    statement till it finds an <b>else</b> or <b>endif</b>
    directive only if the value of the symbol does not match the
    string.</font></p>
</blockquote>

<p><font size="2"><b>endif</b></font></p>

<blockquote>
    <p><font size="2">Indicates the end of the if directives.</font></p>
</blockquote>

<p><font size="2"><b>else</b></font></p>

<blockquote>
    <p><font size="2">Used with if directives to associate
    directives when the condition fails.</font></p>
</blockquote>

<p><font size="2"><b>crlf</b></font></p>

<blockquote>
    <p><font size="2">Inserts a new line in the output file.</font></p>
</blockquote>

<p><font size="2"><b>outputoff</b></font></p>

<blockquote>
    <p><font size="2">Turns off the output of the processed file.</font></p>
</blockquote>

<p><font size="2"><b>outputon</b></font></p>

<blockquote>
    <p><font size="2">Turns on the output of the processed file.</font></p>
</blockquote>

<p><font size="2"><b>set(SYMBOL, &quot;</b><b><i>value&quot;</i></b><b>)</b></font></p>

<blockquote>
    <p><font size="2">Sets the value of the symbol in the map of
    symbols. If the symbol is not in the map then it is added to
    the map.</font></p>
</blockquote>

<p><font size="2"><b>RemoveSymbol (SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Removes the symbol from the internal map.</font></p>
</blockquote>

<p><font size="2"><b>include(FILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Parses the contents of the specified file
    and add the parsed contents to the outputfile. It should be
    included after a target directive.</font></p>
</blockquote>

<p><font size="2"><b>target() or target(FILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Specifies that further output should be
    sent to the specified file if one is suggested. Use the
    include directive to add contents of a template file in to
    the output file after processing it.</font></p>
</blockquote>

<blockquote>
    <p><font size="2">When specified without a filename it closes
    the current outputfile.</font></p>
    <p><font size="2">Before processing the file this Sets a
    symbol FileExists to &quot;TRUE&quot; or &quot;FALSE&quot;
    depending on whether the target file already exists.</font></p>
    <p><font size="2">Example :</font></p>
    <p><font size="2">target(CPPFILE)</font></p>
    <p><font size="2">include(CPPTEMPLATE)</font></p>
    <p><font size="2">target()</font></p>
    <p><font size="2">The above directives assume that CPPFILE
    and CPPTEMPLATE symbols point to valid filenames. The first
    directive target(CPPFILE) specifies that further output
    should be sent to the specified file. The
    include(CPPTEMPLATE) directive specifies that the template
    file specified by CPPTEMPLATE should be processed by the
    wizard and the processed contents sent to the current output
    file. The last directive target() specifies that the current
    output file should be closed. At this point there is not
    current output file.</font></p>
</blockquote>

<p><font size="2"><b>newguid(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Directive creates a new guid and puts its
    value into the specified SYMBOL</font></p>
</blockquote>

<p><font size="2"><b>CopyFile(EXISTINGFILENAME, NEWFILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Copies existing file to a new file</font></p>
</blockquote>

<p><font size="2"><b>DeleteFile(FILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Deletes the file</font></p>
</blockquote>

<p><font size="2"><b>GetTemporaryFileName(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Uses system calls to create a temporary
    filename and sets the symbol to the value.</font></p>
</blockquote>

<p><font size="2"><b>DoubleSlash(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Adds a \ after an existing \ to the value
    of the symbol. This will be useful when adding headers files
    with a path in them.</font></p>
</blockquote>

<blockquote>
    <p><font size="2">Example</font></p>
    <p><font size="2">INCLUDEFILESTRING has value of
    &quot;..\include\headerfile.h&quot;</font></p>
    <p><font size="2">After the following directive is executed </font></p>
    <p><font size="2">DoubleSlash(INCLUDEFILESTRING)</font></p>
    <p><font size="2">INCLUDEFILESTRING will be
    &quot;..\\include\\headerfile.h&quot;</font></p>
</blockquote>

<p><font size="2"><b>AddInterfaceToIDL(IDLFILENAME, FILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Processes the contents of the specified
    file and adds it to the IDL file assuming that the contents
    in the specified file is information about an Interface.</font></p>
</blockquote>

<p><font size="2"><b>AddCoClassToIDL(IDLFILENAME, FILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Processes the contents of the specified
    file and adds it to the IDL file assuming that the contents
    in the specified file is information about a CoClass.</font></p>
</blockquote>

<p><font size="2"><b>AddToObjectMap(COCLASSNAME, CLASSNAME)</b></font></p>

<blockquote>
    <p><font size="2">Adds a directive to the ObjectMap of
    project associating the CoClass with the class.</font></p>
</blockquote>

<p><font size="2"><b>AddIncludeFile(FILENAME, INCLUDEDIRECTIVE)</b></font></p>

<blockquote>
    <p><font size="2">Adds the #include preprocessor directive to
    the specified file. INCLUDEDIRECTIVE specifies what follows
    #include. The is added after any existing #include directives
    in the file.</font></p>
</blockquote>

<p><font size="2"><b>AddImportFile(IDLFILENAME, &quot;</b><b><i>value&quot;</i></b><b>)</b></font></p>

<blockquote>
    <p><font size="2">Adds the import statement line to the
    specified IDL file. Value specifies what to import. This is
    added after any existing import statements in the IDL file</font></p>
</blockquote>

<p><font size="2"><b>AddSymbolToString(NEWSYMBOL, &quot;</b><b><i>value&quot;</i></b><b>,
SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Appends the string specified by the symbol
    to the value and associates the resulting value with the
    newsymbol.</font></p>
</blockquote>

<p><font size="2"><b>AddStringToSymbol(NEWSYMBOL, SYMBOL, &quot;</b><b><i>value&quot;</i></b><b>)</b></font></p>

<blockquote>
    <p><font size="2">Appends the value of the symbol specified
    by the second argument to the contents of the string value
    and associates the resulting value with the symbol specified
    as the first argument.</font></p>
</blockquote>

<p><font size="2"><b>AddSymbolToSymbol(SYMBOL1, SYMBOL2)</b></font></p>

<blockquote>
    <p><font size="2">Appends the value of SYMBOL2 to the value
    of SYMBOL1 and associates the resulting string with SYMBOL1</font></p>
</blockquote>

<p><font size="2"><b>Dialog(&quot;</b><b><i>dialog1_progid&quot;</i></b><b>[,&quot;</b><b><i>dialog2_progid&quot;</i></b><b>[,&#133;])</b></font></p>

<blockquote>
    <p><font size="2">Directive allows the user to invoke the
    property pages to allow the user to specify the settings for
    the object being inserted. Specify the ProgID of the
    registered property pages. Please refer to the section on
    property pages for information about registering property
    pages and communicating with the wizard from the property
    page.</font></p>
</blockquote>

<blockquote>
    <p><font size="2">You can specify a maximum of 9 pages.</font></p>
</blockquote>

<p><font size="2"><b>AddFileToProject(FILENAME)</b></font></p>

<blockquote>
    <p><font size="2">Adds the file to the project with the
    default build settings.</font></p>
</blockquote>

<p><font size="2"><b>strcpy(SYMBOL1, SYMBOL2)</b></font></p>

<blockquote>
    <p><font size="2">Copies the value of symbol2 to the symbol1</font></p>
</blockquote>

<p><font size="2"><b>toupper(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">converts the value of the symbol to upper
    case</font></p>
</blockquote>

<p><font size="2"><b>tolower(SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Converts the value of symbol to lower case</font></p>
</blockquote>

<p><font size="2"><b>AddRegistryToRC(RGSFILENAME, ID_RGS)</b></font></p>

<blockquote>
    <p><font size="2">Adds the specified RGS file into the
    resources as type REGISTRY with the specified ID.</font></p>
</blockquote>

<p><font size="2"><b>AddStringResource(ID_OF_STRING, SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Adds a string resource with the specified
    ID to the RC file. The values of the string will be the value
    of the symbol.</font></p>
</blockquote>

<p><font size="2"><b>AddResourceFromFile(FILE, ID_RESOURCE,
RESOURCETYPE)</b></font></p>

<blockquote>
    <p><font size="2">Adds the contents of the specified file to
    the RC file under the correct resource type with the
    specified ID</font></p>
</blockquote>

<p><font size="2"><b>Debug ()</b></font></p>

<blockquote>
    <p><font size="2">If this directive is added to the .CTL file
    the wizard displays the directive that failed in case of a
    failure.</font></p>
</blockquote>

<p><font size="2"><b>Error (&quot;error message&quot;)</b></font></p>

<blockquote>
    <p><font size="2">Use this directive to terminate the wizard.
    It displays the error message before terminating.</font></p>
</blockquote>

<p><font size="2"><b>AddToMap(CLASSNAME, &quot;map&quot;,
&quot;map entry&quot;, &quot;#of parameters&quot; [,
&quot;parameter1&quot; [,...]])</b></font></p>

<blockquote>
    <p><font size="2">Adds an entry to the specified map in the
    given class.</font></p>
</blockquote>

<blockquote>
    <p><font size="2"><b>CLASSNAME</b> &#150; specifies the class
    that contains the map</font></p>
    <p><font size="2"><b>map name </b>&#150; name of the map to
    add the entry to.</font></p>
    <p><font size="2"><b>map entry</b> &#150; the type of entry</font></p>
    <p><font size="2"><b>#of parameters</b> &#150; number of
    parameters in the entry.</font></p>
    <p><font size="2"><b>parameter1, ...</b> &#150; parameters to
    the entry. Max of 5 parameters.</font></p>
    <p><font size="2"><strong><u>Example.</u></strong></font></p>
    <p><font size="2">AddToMap(CONTROLCLASS, &quot;COM&quot;,
    &quot; COM_INTERFACE_ENTRY&quot;, &quot;1&quot;,
    &quot;ISomeInterface&quot;)</font></p>
    <p><font size="2">This will add the following line to the COM
    map in the class specified by CONTROLCLASS.</font></p>
    <p><font size="2">COM_INTERFACE_ENTRY(ISomeInterface)</font></p>
</blockquote>

<p><font size="2"><b>AddClassInclude([CLASSNAME |
&quot;classname&quot;], [INCLUDENAME | &quot;includename&quot;],
&quot;[h | cpp]&quot;)</b></font></p>

<blockquote>
    <p><font size="2">Add the include directive to the header or
    the implementation file associated with a specified class.</font></p>
    <p><font size="2"><b>CLASSNAME or classname </b>&#150; the
    class used to determine the file to put the directive in.
    This can be a symbol or a value.</font></p>
    <p><font size="2"><b>INCLUDENAME or includename</b> &#150;
    specified what to include</font></p>
    <p><font size="2"><b>h or cpp</b> &#150; specifies where to
    put the directive. h specifies the header file for the class.
    cpp specifies implementation file for the class.</font></p>
</blockquote>

<p><font size="2"><b>AddMemberFunction([CLASSNAME |
&quot;classname&quot;], &quot;function name&quot;, &quot;return
type&quot;, &quot;parameters&quot;, &quot;access&quot;,
TEMPLATEFILE, &quot;classwizfunc&quot;)</b></font></p>

<blockquote>
    <p><font size="2">Adds the specified member function to the
    class.</font></p>
    <p><font size="2"><b>CLASSNAME or classname</b> &#150; the
    class the function has to be added to.</font></p>
    <p><font size="2"><b>function name</b> &#150; name of the
    function to add</font></p>
    <p><font size="2"><b>return type</b> &#150; return type of
    the function</font></p>
    <p><font size="2"><b>parameters</b> &#150; parameters to the
    function</font></p>
    <p><font size="2"><b>access</b> &#150; can be one of the
    following.</font></p>
    <p><font size="2">ACCESS_PUBLIC &#150; adds the function as a
    public member function.</font></p>
    <p><font size="2">ACCESS_PROTECTED &#150; adds the function
    as a protected member function.</font></p>
    <p><font size="2">ACCESS_PRIVATE &#150; adds the function as
    a private member function.</font></p>
    <p><font size="2"><b>TEMPLATEFILE</b> &#150; specifies the
    template file that contains the body of the function.</font></p>
    <p><font size="2"><b>classwizfunc</b> &#150; indicates if the
    function declaration should be between classwizard comments. </font></p>
    <blockquote>
        <p><font size="2">If this is &quot;0&quot; then it is not
        a function that should be added between classwizard
        comments.<br>
        If it is &quot;1&quot; the it is added between the
        classwizard comments that pertain to virtual <b>functions.<br>
        </b>Any other value add it between the comments
        associated with class wizard message handler comments.</font></p>
    </blockquote>
</blockquote>

<p><font size="2"><b>AddMemberVariable([CLASSNAME |
&quot;classname&quot;], &quot;variable name&quot;, &quot;variable
type&quot;, &quot;access&quot;, &quot;unique variable&quot;[,
UNIQUEVARSYMBOL])</b></font></p>

<blockquote>
    <p><font size="2">Adds the specified member variable to the
    class.</font></p>
    <p><font size="2"><b>CLASSNAME</b> or classname &#150; the
    class the variable has to be added to.</font></p>
    <p><font size="2"><b>variable name</b> &#150; name of the
    variable to add</font></p>
    <p><font size="2"><b>variable type</b> &#150;type of variable</font></p>
    <p><font size="2"><b>access</b> &#150; can be one of the
    following.</font></p>
    <blockquote>
        <p><font size="2">ACCESS_PUBLIC &#150; adds the function
        as a public member variable.</font></p>
        <p><font size="2">ACCESS_PROTECTED &#150; adds the
        function as a protected member variable</font></p>
        <p><font size="2">ACCESS_PRIVATE &#150; adds the function
        as a private member variable.</font></p>
    </blockquote>
    <p><font size="2"><b>unique variable</b> &#150; indicates
    whether the variable has to be an unique symbol.</font></p>
    <blockquote>
        <p><font size="2">&quot;1&quot; indicates that the symbol
        has to be unique. requires the next parameter.</font></p>
        <p><font size="2">other values indicate that if a
        variable is already present then do nothing. Does not
        require the next parameter.</font></p>
    </blockquote>
    <p><font size="2"><b>UNIQUEVARSYMBOL</b> &#150; If a unique
    symbol first checks to see if the variable is already a
    member of the class. If not it add the variable and sets this
    symbol to value passed in. If the variable already exists
    then the wizard adds numbers after the given variable name
    till it finds a value that is unique and adds the variable to
    the class. On return this symbol will contain the value that
    was created and inserted into the class.</font></p>
</blockquote>

<p><font size="2"><b>AddToMemberFunction([CLASSNAME |
&quot;classname&quot;], function, TEMPLATEFILE, SYMBOL,
SEARCHTYPE[, &quot;search criteria&quot;])</b></font></p>

<blockquote>
    <p><font size="2">Adds code to a function depending onto
    search. When a string search fails the code is added to the
    end of the function.</font></p>
    <p><font size="2"><b>CLASSNAME or classname</b> &#150; the
    class the function is a member of. Use NULL for global
    functions.</font></p>
    <p><font size="2"><b>function</b> &#150; function to add code
    to.</font></p>
    <p><font size="2"><b>TEMPLATEFILE</b> &#150; template file
    that contains the code to be inserted.</font></p>
    <p><font size="2"><b>SYMBOL</b> &#150; this symbol is set to
    1 before the template file is processed and then removed
    after the processing is over. This allows a template file to
    contain code for different purposes all of them wrapped in
    different conditionals.</font></p>
    <p><font size="2"><b>SEARCHTYPE</b> &#150; can be one of the
    following.</font></p>
    <blockquote>
        <p><font size="2">BEGIN &#150; beginning of the function.
        Does not require the next parameter.</font></p>
        <p><font size="2">END &#150; end of the function. Does
        not require the next parameter.</font></p>
        <p><font size="2">LINEOFFSET &#150; a line offset from
        the beginning of the function. Next parameter is a number
        that gives the offset.</font></p>
    </blockquote>
    <p><font size="2"><b>AFTERSEARCH</b> &#150; Inserts on the
    line after the line that contains the search string. Next
    parameter is the string to search for. Search begins at the
    beginning of the function and the first match is used. If
    search fails the string is added to the end of the function.</font></p>
    <p><font size="2"><b>BEFORESEARCH</b> &#150; Inserts on the
    line before the line that contains the search string. Search
    begins at the beginning of the function and the first match
    is used. If search fails the string is added to the end of
    the function.</font></p>
    <p><font size="2"><b>search criteria</b> &#150; depends on
    the previous parameter.</font></p>
</blockquote>

<p><font size="2"><b>AddBaseClass(CLASSNAME, BASECLASS,
&quot;access&quot;)</b></font></p>

<blockquote>
    <p><font size="2">Adds a class as a base class to the
    specified class.</font></p>
    <p><font size="2"><b>CLASSNAME</b> &#150; the class to which
    the baseclass is to be added</font></p>
    <p><font size="2"><b>BASECLASS</b> &#150; the class to be
    added as the base class</font></p>
    <p><font size="2"><b>access</b> &#150; This is ignored. The
    class is added as public.</font></p>
</blockquote>

<p><font size="2"><b>ExistsMemberFunction([CLASSNAME |
&quot;classname&quot;], &quot;function prototype&quot;, SYMBOL)</b></font></p>

<blockquote>
    <p><font size="2">Checks if a function is a member of the
    specified class.</font></p>
    <p><font size="2"><b>CLASSNAME or classname</b> &#150; The
    class that should contain the member function. Use NULL for
    global functions.</font></p>
    <p><font size="2"><b>function prototype</b> &#150; prototype
    of the function to check</font></p>
    <p><font size="2"><b>SYMBOL</b> &#150; this symbol is set to
    &quot;1&quot; if the function is a member otherwise it is set
    to &quot;0&quot;.</font></p>
</blockquote>

<p><font size="2"><strong>ExistsInMemberFunction([CLASSNAME |
&quot;classname&quot;], &quot;function prototype&quot;,
&quot;search string&quot;, SYMBOL)</strong></font></p>

<blockquote>
    <p><font size="2">Checks if a function contains the specified
    string.</font></p>
    <p><font size="2"><b>CLASSNAME or classname </b>&#150; the
    class the function is a member of. Use NULL for global
    functions.</font></p>
    <p><font size="2"><b>function prototype</b> &#150; prototype
    of the function to search in.</font></p>
    <p><font size="2"><b>search string</b> &#150; string to
    search for</font></p>
    <p><font size="2"><b>SYMBOL</b> &#150; this symbol is set to
    &quot;1&quot; if the search succeeds otherwise it is set to
    &quot;0&quot;.</font></p>
</blockquote>

<p><font size="2"><b>IDLSettingsForATL()</b></font></p>

<blockquote>
    <p><font size="2">Modifies the settings for an IDL/ODL
    already in the project to match the settings required for
    using ATL in the project.</font></p>
</blockquote>

<p><font size="2"><b>OpenDialog(DIALOGID)</b></font></p>

<blockquote>
    <p><font size="2">Opens a dialog in the dialog editor after
    the wizard exists.</font></p>
</blockquote>

<blockquote>
    <p><font size="2"><b>DIALOGID</b> &#150; the id of the dialog
    to open.</font></p>
</blockquote>

<p><font size="2"><b>Commit()</b></font></p>

<blockquote>
    <p><font size="2">Commits changes made by the wizard till
    that point. Changes made before this directive will not
    undone if the wizard fails after this directive. This
    directive commits all the changes before it so the changes
    can be accessed in the wizard. This is used by the Dialog
    wizard to open the dialog resource. Any change made by the
    wizard will not be accessible in the wizard till they are
    committed by this directive.</font></p>
</blockquote>

<p><font size="4"><b><u>PropertyPages</u></b></font></p>

<p><font size="2">Property pages can be created to allow
customization of the object being inserted. The wizard creates a
property sheet using the OleCreatePropertyFrame API. The property
pages that are displayed using this property sheet should support
the IPropertyPage interface.</font></p>

<p><font size="2">Property pages can communicate with the wizard
using the ISymbolMap interface implemented by the wizard. </font></p>

<p><font size="3"><b>ISymbolMap</b></font></p>

<p><font size="2">In addition to the IUnknown methods it
implements the following.</font></p>

<p><font size="2"><b>HRESULT Set(/* [in] */ LPCOLESTR strSymbol,
/* [in] */ LPCOLESTR strValue);</b></font></p>

<blockquote>
    <p><font size="2">Adds the symbol string pair to the internal
    map of the wizard</font></p>
</blockquote>

<blockquote>
    <p><font size="2">Returns S_OK</font></p>
</blockquote>

<p><font size="2"><b>HRESULT Get(/* [in] */ LPCOLESTR strSymbol,
/* [retval][out] */ BSTR *pstrValue);</b></font></p>

<blockquote>
    <p><font size="2">Retrieves the value associated with the
    specified symbol. If the call is successful pstrValue will
    point to a BSTR which is allocated using SysAllocString. The
    caller should free this string using SysFreeString</font></p>
    <p><font size="2">Returns S_OK if it finds the symbol. E_FAIL
    if the symbol is not found.</font></p>
</blockquote>

<p><font size="2"><b>HRESULT STDMETHODCALLTYPE Clear(void) ;</b></font></p>

<blockquote>
    <p><font size="2">Clears all the internal map of the wizard
    of all symbols.</font></p>
</blockquote>

<p><font size="2"><b>HRESULT SetStatus(const CLSID *pclsid, BOOL
bEnableOK);</b></font></p>

<blockquote>
    <p><font size="2">Allows each individual property pages to
    specify if the OK button can be enabled to allow the user to
    complete their selections. This is useful when the OK button
    has to be disabled till the user has entered some required
    values.</font></p>
    <p><font size="2"><strong>pcslid</strong> points to the CLSID
    of the property page that is calling this method. </font></p>
    <p><font size="2"><strong>bEnableOK</strong> specifies
    whether the OK button should be enable or disabled. TRUE
    specifies enable.</font></p>
</blockquote>

<p><font size="2">ISymbolMap can be obtained by Querying the
IUnknown passed through SetObjects method of IPropertyPage.</font></p>

<p><font size="4"><b><u>Existing Property Pages</u></b></font></p>

<p><font size="2">Following are some of the existing property
pages.</font></p>

<p><font size="2"><b><u>Names Property Page</u></b></font></p>

<p><font size="2">Sets the following symbols. ProgID is
&quot;Names98&quot;. The symbol ComponentType controls
enabling/disabling controls. This is a string with each character
representing the field in the tab order. Each char should be
either 0 or 1.</font></p>

<p><font size="2"></font>&nbsp;</p>

<table border="1" cellpadding="9" width="100%"
bordercolor="#000000">
    <tr>
        <td valign="top" width="32%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Symbol</b></font></td>
        <td valign="top" width="68%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Contents of field on the
        Property Page that is used for value</b></font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ShortName </font></td>
        <td valign="top" width="68%"><font size="2">Short Name</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ClassName</font></td>
        <td valign="top" width="68%"><font size="2">Class</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">HeaderName</font></td>
        <td valign="top" width="68%"><font size="2">.H File</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">CPPName</font></td>
        <td valign="top" width="68%"><font size="2">.CPP File</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">CoClassName</font></td>
        <td valign="top" width="68%"><font size="2">CoClass</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">InterfaceName</font></td>
        <td valign="top" width="68%"><font size="2">Interface</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">TypeName</font></td>
        <td valign="top" width="68%"><font size="2">Type</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ProgID</font></td>
        <td valign="top" width="68%"><font size="2">ProgID with a
        .1 appended</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">VersionIndependentProgID</font></td>
        <td valign="top" width="68%"><font size="2">ProgId</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ObjectGUID</font></td>
        <td valign="top" width="68%"><font size="2">None. A new
        GUID is generated and its value is used.</font></td>
    </tr>
</table>

<p><font size="2"><b><u>Miscellaneous Property Page</u></b></font></p>

<p><font size="2">Sets the following Symbols. ProgID is
&quot;CtlDlg98&quot;</font></p>

<table border="1" cellpadding="9" width="100%"
bordercolor="#000000">
    <tr>
        <td valign="top" width="32%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Symbol</b></font></td>
        <td valign="top" width="68%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Contents of field on the
        Property Page that is used for value</b></font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">WindowedOnlyEnabled</font></td>
        <td valign="top" width="68%"><font size="2">Windowed
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">InsertableEnabled</font></td>
        <td valign="top" width="68%"><font size="2">Insertable
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">NormalizeDCEnabled</font></td>
        <td valign="top" width="68%"><font size="2">Normalize DC
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">Opaque</font></td>
        <td valign="top" width="68%"><font size="2">Opaque (TRUE
        or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">SolidBackground</font></td>
        <td valign="top" width="68%"><font size="2">SolidBackground
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">MiscStatus</font></td>
        <td valign="top" width="68%"><font size="2">Misc setting
        fields</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">SubclassWindow</font></td>
        <td valign="top" width="68%"><font size="2">Subclass
        Combobox selection</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">SubclassWindowSymbol</font></td>
        <td valign="top" width="68%"><font size="2">Subclass
        Combobox selection without those characters that cannot
        be used in an identifier.</font></td>
    </tr>
</table>

<p><font size="2"><b><u>Attributes Property Page</u></b></font></p>

<p><font size="2">Sets the following Symbols. ProgID is
&quot;ObjDlg98&quot;</font></p>

<p><font size="2">The symbol Attributes controls
enabling/disabling controls. This is a string with each character
representing the field in the tab order. Each char should be
either 0 or 1.</font></p>

<table border="1" cellpadding="9" width="100%"
bordercolor="#000000">
    <tr>
        <td valign="top" width="32%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Symbol</b></font></td>
        <td valign="top" width="68%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Contents of field on the
        Property Page that is used for value</b></font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">FreeThreadedMarshaler</font></td>
        <td valign="top" width="68%"><font size="2">FreeThreadedMarshaler
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ErrorInfoEnabled</font></td>
        <td valign="top" width="68%"><font size="2">ErrorInfo
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ConnectionPointsEnabled</font></td>
        <td valign="top" width="68%"><font size="2">ConnectionPoints
        (TRUE or FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">Dual</font></td>
        <td valign="top" width="68%"><font size="2">Dual (TRUE or
        FALSE)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">ThreadingModel</font></td>
        <td valign="top" width="68%"><font size="2">ThreadingModel
        (Single, Apartment, Both, Free)</font></td>
    </tr>
    <tr>
        <td valign="top" width="32%"><font size="2">Aggregatable</font></td>
        <td valign="top" width="68%"><font size="2">Aggregatable
        (YES, NO, ONLY)</font></td>
    </tr>
</table>

<p><font size="4"><b><u>Registry entries.</u></b></font></p>

<p><font size="2">The following keys are added to the registry
under the </font></p>

<p><font size="2">HKCU\Software\Microsoft\ATLWizard</font></p>

<p><font size="2">{GUID} </font></p>

<p><font size="2">Category &#150; REG_SZ
&quot;&lt;Category&gt;&quot;</font></p>

<p><font size="2">Control &#150; REG_SZ &quot;&lt;File
name&gt;&quot;</font></p>

<p><font size="2">Icon &#150; REG_SZ &quot;File Name&gt;&quot;</font></p>

<p><font size="2">Name &#150; REG_SZ &quot;&lt;Name&gt;&quot;</font></p>

<p><font size="2">{GUID} &#150; a GUID for your component. This
is not associated with anything else. A GUID is used to get a
unique name</font></p>

<p><font size="2">Category &#150; specifies the category under
which the component should appear. </font></p>

<p><font size="2">Control &#150; name of the control file that
has directives for the component. It is normally a .CTL file.</font></p>

<p><font size="2">Icon &#150; Name of the file that contains the
Icon for the component.</font></p>

<p><font size="2">Name &#150; Name of the component.</font></p>

<p><font size="2">Register the property page. The wizard loads
the property page using its ProgID specified in the directive
file.</font></p>

<p><b><u>Symbols set by the Wizard before invoking the control
file.</u></b></p>

<table border="1" cellpadding="9" width="100%"
bordercolor="#000000">
    <tr>
        <td valign="top" width="29%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Symbol</b></font></td>
        <td valign="top" width="71%" bgcolor="#808080"><font
        color="#FFFFFF" size="2"><b>Value</b></font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">LibName</font></td>
        <td valign="top" width="71%"><font size="2">Name of the
        typelib in the .IDL file for the project</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">LibGUID</font></td>
        <td valign="top" width="71%"><font size="2">GUID of the
        typelib</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">GalleryPath</font></td>
        <td valign="top" width="71%"><font size="2">Points to the
        directory that contains the template files</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectName</font></td>
        <td valign="top" width="71%"><font size="2">Name of the
        project</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectNameCPP</font></td>
        <td valign="top" width="71%"><font size="2">Name of the
        project cpp file. (projectname.cpp)</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectType</font></td>
        <td valign="top" width="71%"><font size="2">type of
        project. EXE or DLL</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectAppID</font></td>
        <td valign="top" width="71%"><font size="2">the AppID of
        the local server it the project is of type EXE. Otherwise
        not set</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectNameRC</font></td>
        <td valign="top" width="71%"><font size="2">Name of the
        RC file for the project. (Projectname.rc)</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectNameHeader</font></td>
        <td valign="top" width="71%"><font size="2">Name of the
        project header. (Projectname.h)</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">VCINCDIR</font></td>
        <td valign="top" width="71%"><font size="2">Points to vc
        include directory</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">NULLSTR</font></td>
        <td valign="top" width="71%"><font size="2">set to
        &quot;&quot;</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">VC</font></td>
        <td valign="top" width="71%"><font size="2">Set to 6.0 in
        VC 6.0</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">STDAFXH</font></td>
        <td valign="top" width="71%"><font size="2">Set to
        stdafx.h</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">stdafx.h</font></td>
        <td valign="top" width="71%"><font size="2">Set stdafx.h</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">STDAFXCPP</font></td>
        <td valign="top" width="71%"><font size="2">Set to
        stdafx.cpp</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">stdafx.cpp</font></td>
        <td valign="top" width="71%"><font size="2">Set to
        stdafx.cpp</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ObjectMap</font></td>
        <td valign="top" width="71%"><font size="2">Set to 1 if
        object map is found. otherwise symbol is not available</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectDirectory</font></td>
        <td valign="top" width="71%"><font size="2">Projects
        directory</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">IDLProject</font></td>
        <td valign="top" width="71%"><font size="2">Name of the
        IDL/ODL file for the project. Set to &quot;&quot; if the
        project does not have an IDL/ODL</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectHadIDL</font></td>
        <td valign="top" width="71%"><font size="2">Set to TRUE
        if the project has IDL/ODL file. Otherwise the symbol is
        not available.</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">CWinApp</font></td>
        <td valign="top" width="71%"><font size="2">If the
        project is MFC then this SYMBOL contains the name of the
        CWinApp derived class otherwise set to &quot;&quot;</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">MFC</font></td>
        <td valign="top" width="71%"><font size="2">Set to
        &quot;1&quot; for MFC projects. Otherwise not available</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">MFCCTL</font></td>
        <td valign="top" width="71%"><font size="2">Set to
        &quot;1&quot; if the project is a MFC control project.
        otherwise set to &quot;0&quot;</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">MFCOLE</font></td>
        <td valign="top" width="71%"><font size="2">Set to
        &quot;1&quot; if MFC project is MFC control project.
        Otherwise not available.</font></td>
    </tr>
    <tr>
        <td valign="top" width="29%"><font size="2">ProjectNameSafe</font></td>
        <td valign="top" width="71%"><font size="2">If the
        project name contains characters that cannot be used as
        an identifier the this symbol contain the project name
        after removing such characters.</font></td>
    </tr>
</table>

<p><font size="2"></font>&nbsp;</p>

<p><font size="4"><b>Sample Registry files.</b></font></p>

<pre><b>.RGS file for the wizard.</b></pre>

<pre><font size="3">HKCR
{
	ATLOBJ.ATLWiz = s 'ATL Object Wizard'
	{
		CurVer = s 'ATLOBJ.ATLWiz.1'
		CLSID = s '{2EF12E30-3C3B-11d1-AFA9-00C04FB99436}'
	}
	ATLOBJ.ATLWiz.1 = s 'ATL Object Wizard'
	{
		CLSID = s '{2EF12E30-3C3B-11d1-AFA9-00C04FB99436}'
	}
	NoRemove CLSID
	{
		ForceRemove {2EF12E30-3C3B-11d1-AFA9-00C04FB99436} = s 'ATL Object Wizard'
		{
			ProgID = s 'ATLOBJ.ATLWiz.1'
			VersionIndependentProgID = s 'ATLOBJ.ATLWiz'
			InprocServer32 = s '%Module%'
		}
	}
}
HKLM
{
	Software
	{
		Microsoft
		{
			DevStudio
			{
				6.0
				{
					ATLWizard
					{
						'{6E871954-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Control' = s 'object.ctl'
							val 'Icon' = s 'object.ico'
							val 'Name' = s 'Simple Object'
						}
						'{6E871955-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Name' = s 'Add-in Object'
							val 'Control' = s 'addin.ctl'
							val 'Icon' = s 'addin.ico'
						}
						'{6E871956-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Name' = s 'Internet Explorer Object'
							val 'Control' = s 'ieuiless.ctl'
							val 'Icon' = s 'iexplore.ico'
						}
						'{6E871957-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Name' = s 'ActiveX Server Component'
							val 'Control' = s 'asp.ctl'
							val 'Icon' = s 'asp.ico'
						}
						'{6E871960-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Name' = s 'MS Transaction Server Component'
							val 'Control' = s 'msdtx.ctl'
							val 'Icon' = s 'msdtx.ico'
						}
						'{6E871961-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Name' = s 'Component Registrar Object'
							val 'Control' = s 'compreg.ctl'
							val 'Icon' = s 'compreg.ico'
						}
						'{6E871958-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'Full Control'
							val 'Control' = s 'control.ctl'
							val 'Icon' = s 'control.ico'
						}
						'{6E871959-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'Lite Control'
							val 'Control' = s 'control.ctl'
							val 'Icon' = s 'iexplore.ico'
							val 'SetSymbol' = s 'IEControl'
						}
						'{6E87195D-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'Composite Control'
							val 'Control' = s 'control.ctl'
							val 'Icon' = s 'compsite.ico'
							val 'SetSymbol' = s 'CompositeControl'
						}
						'{6E871962-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'HTML Control'
							val 'Control' = s 'control.ctl'
							val 'Icon' = s 'HTML.ico'
							val 'SetSymbol' = s 'HTMLControl'
						}
						'{6E87195A-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'Property Page'
							val 'Control' = s 'proppage.ctl'
							val 'Icon' = s 'proppage.ico'
						}
						'{6E87195B-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Miscellaneous'
							val 'Control' = s 'dialog.ctl'
							val 'Icon' = s 'dialog.ico'
							val 'Name' = s 'Dialog'
						}
						'{6E87195E-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Objects'
							val 'Control' = s 'snapin.ctl'
							val 'Icon' = s 'snapin.ico'
							val 'Name' = s 'MMC SnapIn'
						}
						'{6E87195C-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Data Access'
							val 'Name' = s 'Provider'
							val 'Control' = s 'provider.ctl'
							val 'Icon' = s 'provider.ico'
						}
						'{6E87195F-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Data Access'
							val 'Name' = s 'Consumer'
							val 'Control' = s 'consumer.ctl'
							val 'Icon' = s 'consumer.ico'
						}
						'{6E871963-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'Lite Composite Control'
							val 'Control' = s 'control.ctl'
							val 'Icon' = s 'compsite.ico'
							val 'SetSymbol' = s 'CompositeControl,IEControl'
						}
						'{6E871964-50AD-11D0-883E-080000185165}'
						{
							val 'Category' = s 'Controls'
							val 'Name' = s 'Lite HTML Control'
							val 'Control' = s 'control.ctl'
							val 'Icon' = s 'HTML.ico'
							val 'SetSymbol' = s 'HTMLControl,IEControl'
						}
					}
				}
			}
		}
	}
}</font></pre>

<p><font size="3">.RGS file for Names property page.</font></p>

<pre><font size="3">HKCR
{
	Names98.Names98 = s 'Names98 Class'
	{
		CurVer = s 'Names98.Names98.1'
		CLSID = s '{53FCBC28-5015-11d1-AFC7-00C04FB99436}'
	}
	Names98.Names98.1 = s 'Names98 Class'
	{
		CLSID = s '{53FCBC28-5015-11d1-AFC7-00C04FB99436}'
	}
	NoRemove CLSID
	{
		ForceRemove {53FCBC28-5015-11d1-AFC7-00C04FB99436} = s 'Names98 Class'
		{
			InprocServer32 = s '%MODULE%'
			{
				val ThreadingModel = s 'Apartment'
			}
		}
	}
}
</font></pre>

<p><font size="3"><b><u>Smaple Property Page code</u></b></font></p>

<p><font size="2"><b>.H File</b></font></p>

<pre><font size="3">// testpg.h : Declaration of the Ctestpg

#ifndef __TESTPG_H_
#define __TESTPG_H_

#include &quot;resource.h&quot;       // main symbols

EXTERN_C const CLSID CLSID_testpg;

/////////////////////////////////////////////////////////////////////////////
// Ctestpg
class ATL_NO_VTABLE Ctestpg :
	public CComObjectRootEx&lt;CComSingleThreadModel&gt;,
	public CComCoClass&lt;Ctestpg, &amp;CLSID_testpg&gt;,
	public IPropertyPageImpl&lt;Ctestpg&gt;,
	public CDialogImpl&lt;Ctestpg&gt;
{
public:
	Ctestpg() 
	{
		m_dwTitleID = IDS_TITLEtestpg;
		m_dwHelpFileID = IDS_HELPFILEtestpg;
		m_dwDocStringID = IDS_DOCSTRINGtestpg;
	}

	enum {IDD = IDD_TESTPG};

DECLARE_REGISTRY_RESOURCEID(IDR_TESTPG)

BEGIN_COM_MAP(Ctestpg) 
	COM_INTERFACE_ENTRY_IMPL(IPropertyPage)
END_COM_MAP()

BEGIN_MSG_MAP(Ctestpg)
	COMMAND_ID_HANDLER(IDC_SET, OnSet);
	COMMAND_ID_HANDLER(IDC_GET, OnGet);
	CHAIN_MSG_MAP(IPropertyPageImpl&lt;Ctestpg&gt;)
END_MSG_MAP()

	LRESULT OnSet(short , short nID , HWND hWnd, BOOL&amp; bHandled)
	{
		CComQIPtr&lt;ISymbolMap, &amp;IID_ISymbolMap&gt; pMap(m_ppUnk[0]);
		if (!pMap)
			return S_OK;

		TCHAR szSymbol[128];
		TCHAR szValue[128];
		GetDlgItemText(IDC_SYMBOL, szSymbol, 128);
		GetDlgItemText(IDC_VALUE, szValue, 128);
		pMap-&gt;Set(CComBSTR(szSymbol), CComBSTR(szValue));
		return 0;
	}

	LRESULT OnGet(short , short nID , HWND hWnd, BOOL&amp; bHandled)
	{
		CComQIPtr&lt;ISymbolMap, &amp;IID_ISymbolMap&gt; pMap(m_ppUnk[0]);
		if (!pMap)
			return S_OK;

		TCHAR szSymbol[128];
		GetDlgItemText(IDC_SYMBOL, szSymbol, 128);
		CComBSTR szValue;
		pMap-&gt;Get(CComBSTR(szSymbol), &amp;szValue);
		USES_CONVERSION;
		SetDlgItemText(IDC_VALUE, OLE2T(szValue));

		return 0;
	}

	STDMETHOD(Apply)(void)
	{
		ATLTRACE(_T(&quot;Ctestpg::Apply\n&quot;));
		if (m_hWnd == NULL)
			return S_OK;
		CComQIPtr&lt;ISymbolMap, &amp;IID_ISymbolMap&gt; pMap(m_ppUnk[0]);
		if (!pMap)
			return S_OK;

		TCHAR szSymbol[128];
		TCHAR szValue[128];
		GetDlgItemText(IDC_SYMBOL, szSymbol, 128);
		GetDlgItemText(IDC_VALUE, szValue, 128);
		pMap-&gt;Set(CComBSTR(szSymbol), CComBSTR(szValue));

		m_bDirty = FALSE;
		return S_OK;
	}
};

#endif //__TESTPG_H_
</font></pre>

<p><font size="2"><b>.rgs</b></font></p>

<pre><font size="3">HKCR
{
	testpg.testpg.1 = s 'testpg Class'
	{
		CLSID = s '{6992CC0C-472B-11D1-AA8C-000000000000}'
	}
	testpg.testpg = s 'testpg Class'
	{
		CLSID = s '{6992CC0C-472B-11D1-AA8C-000000000000}'
		CurVer = s 'testpg.testpg.1'
	}
	NoRemove CLSID
	{
		ForceRemove {6992CC0C-472B-11D1-AA8C-000000000000} = s 'testpg Class'
		{
			ForceRemove 'Programmable'
			InprocServer32 = s '%MODULE%'
			{
				val ThreadingModel = s 'Apartment'
			}
		}
	}
}

</font></pre>

<p><font size="2"><b>Dialog resource for the page</b></font></p>

<pre><font size="3">IDD_TESTPG DIALOG DISCARDABLE  0, 0, 271, 105
STYLE WS_CHILD
FONT 8, &quot;MS Sans Serif&quot;
BEGIN
    EDITTEXT        IDC_SYMBOL,22,24,40,14,ES_AUTOHSCROLL
    LTEXT           &quot;Symbol&quot;,IDC_STATIC,22,8,24,8
    LTEXT           &quot;Value&quot;,IDC_STATIC,87,8,19,8
    EDITTEXT        IDC_VALUE,87,24,40,14,ES_AUTOHSCROLL
    PUSHBUTTON      &quot;Set&quot;,IDC_SET,22,49,40,14
    PUSHBUTTON      &quot;Get&quot;,IDC_GET,87,49,40,14
END</font></pre>

<p><font size="2"><b>String resources.</b></font></p>

<pre><font size="2">IDS_TITLEtestpg &quot;Title&quot;</font></pre>

<pre><font size="2">IDS_HELPFILEtestpg &quot;Help File Name&quot;</font></pre>

<pre><font size="2">IDS_DOCSTRINGtestpg &quot;Your Help String&quot;</font></pre>

<h1><font size="3"><strong><u>ISymbolMap</u></strong></font></h1>

<pre>[
    object,
    uuid(C6D58201-1FA3-11D0-BF1E-0000E8D0D146),
    helpstring(&quot;ISymbolMap Interface&quot;),
    pointer_default(unique)
]
interface ISymbolMap : IUnknown
{
    HRESULT Set([in] LPCOLESTR strSymbol, [in] LPCOLESTR strValue);
    HRESULT Get([in] LPCOLESTR strSymbol, [out, retval] BSTR* pstrValue);
    HRESULT Clear();
    HRESULT SetStatus(const CLSID* pclsid, BOOL bEnableOK);
};</pre>
</body>
</html>
