Files
firestorm/build-env/VisualStudio6/Common/MSDev98/Template/ATL/TEMPLATE.TXT
T
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

1377 lines
49 KiB
Plaintext

<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>