home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
sdk
/
com
/
inole2
/
classlib
/
cstrtabl.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1995-05-03
|
3KB
|
149 lines
/*
* CSTRTABL.CPP
* Sample Code Class Libraries
*
* Implementation of a string table handler. The CStringTable
* class hides details of storage from the user. The strings might
* be cached, or they might be loaded as necessary. In either case,
* we must know the number of strings so we know whether or not to
* reload strings.
*
* Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
*
* Kraig Brockschmidt, Microsoft
* Internet : kraigb@microsoft.com
* Compuserve: >INTERNET:kraigb@microsoft.com
*/
#include <windows.h>
#include <malloc.h>
#include "classlib.h"
/*
* CStringTable::CStringTable
* CStringTable::~CStringTable
*
* Constructor Parameters:
* hInst HANDLE to the application instance from which we
* load strings.
*/
CStringTable::CStringTable(HINSTANCE hInst)
{
m_hInst=hInst;
m_pszStrings=NULL;
m_ppszTable=NULL;
return;
}
CStringTable::~CStringTable(void)
{
if (NULL!=m_pszStrings)
free(m_pszStrings);
if (NULL!=m_ppszTable)
free(m_ppszTable);
return;
}
/*
* CStringTable::Init
*
* Purpose:
* Initialization function for a StringTable that is prone to
* failure. If this fails then the caller is responsible for
* guaranteeing that the destructor is called quickly.
*
* Parameters:
* idsMin UINT first identifier in the stringtable
* idsMax UINT last identifier in the stringtable.
*
* Return Value:
* BOOL TRUE if the function is successful, FALSE
* otherwise.
*/
BOOL CStringTable::Init(UINT idsMin, UINT idsMax)
{
UINT i;
UINT cch;
UINT cchUsed=0;
LPTSTR psz;
m_idsMin=idsMin;
m_idsMax=idsMax;
m_cStrings=(idsMax-idsMin+1);
//Allocate space for the pointer table.
m_ppszTable=(LPTSTR *)malloc(sizeof(LPTSTR)*m_cStrings);
if (NULL==m_ppszTable)
return FALSE;
//Allocate enough memory for cStrings of CCHSTRINGMAX.
m_pszStrings=(LPTSTR)malloc(m_cStrings * CCHSTRINGMAX * sizeof(TCHAR));
if (NULL==m_pszStrings)
{
free(m_ppszTable);
m_ppszTable=NULL;
return FALSE;
}
/*
* Load the strings: we load each string in turn into psz,
* store the string pointer into the table and increment psz
* to the next positions.
*/
psz=m_pszStrings;
for (i=idsMin; i <= idsMax; i++)
{
m_ppszTable[i-idsMin]=psz;
cch=LoadString(m_hInst, i, psz, CCHSTRINGMAX-1);
//Account for a null terminator
psz+=cch+1;
cchUsed+=cch;
}
return TRUE;
}
/*
* CStringTable::operator[]
*
* Purpose:
* Returns a pointer to the requested string in the stringtable or
* NULL if the specified string does not exist.
*/
const LPTSTR CStringTable::operator[](const UINT uID) const
{
if (uID < m_idsMin || uID > m_idsMax)
return NULL;
return (const LPTSTR)m_ppszTable[uID-m_idsMin];
}