You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
277 lines
8.2 KiB
277 lines
8.2 KiB
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996.
|
|
//
|
|
// File: utility.cxx
|
|
//
|
|
// Contents: Helpful functions
|
|
//
|
|
// Classes:
|
|
//
|
|
// Functions: == and != for STAT_CHUNK, StrToGuid, HexStrToULONG
|
|
// StrToPropspec, GuidToPwc
|
|
//
|
|
// Coupling:
|
|
//
|
|
// Notes:
|
|
//
|
|
// History: 9-24-1996 ericne Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "pch.cxx"
|
|
#include "utility.hxx"
|
|
#include "mydebug.hxx"
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: FreePropVariant
|
|
//
|
|
// Synopsis: Frees the memory associated with the PROPVARIANT struct
|
|
//
|
|
// Arguments: [pPropValue] -- pointer to a PROPVARIANT
|
|
//
|
|
// Returns: VOID
|
|
//
|
|
// History: 10-14-1996 ericne Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
void FreePropVariant( PROPVARIANT *& pPropValue )
|
|
{
|
|
|
|
HRESULT hResult = PropVariantClear( pPropValue );
|
|
|
|
_ASSERT( S_OK == hResult );
|
|
|
|
CoTaskMemFree( pPropValue );
|
|
|
|
} //FreePropVariant
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: StrToGuid
|
|
//
|
|
// Synopsis: Converts a precisely formatted string into a GUID
|
|
//
|
|
// Arguments: [szString] -- the string containing the guid information
|
|
// [pGuid] -- a pointer to the guid
|
|
//
|
|
// Returns: TRUE if successful, FALSE if some error occurs
|
|
//
|
|
// History: 9-23-1996 ericne Created
|
|
//
|
|
// Notes: This functions does extensive error checking to make
|
|
// sure it has a correctly formatted guid string.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL StrToGuid( LPCTSTR szString, GUID *pGuid )
|
|
{
|
|
// Here is a sample guid string:
|
|
// AA568EEC-E0E5-11CF-8FDA-00AA00A14F93
|
|
|
|
int iIndex = 0;
|
|
int iCounter = 0;
|
|
ULONG ulTemp = 0;
|
|
|
|
// Make sure the input string is formatted correctly
|
|
if( _T('-') != szString[8] || _T('-') != szString[13] ||
|
|
_T('-') != szString[18] || _T('-') != szString[23] ||
|
|
_T('\0') != szString[36] )
|
|
{
|
|
printf( "Unable to parse guid %s\r\n", szString );
|
|
return( FALSE );
|
|
}
|
|
|
|
// Fill in the first 3 guid fields:
|
|
if( ! HexStrToULONG( &szString[0], 8, &ulTemp ) )
|
|
return( FALSE );
|
|
pGuid->Data1 = ulTemp;
|
|
|
|
if( ! HexStrToULONG( &szString[9], 4, &ulTemp ) )
|
|
return( FALSE );
|
|
pGuid->Data2 = ( USHORT )ulTemp;
|
|
|
|
if( ! HexStrToULONG( &szString[14], 4, &ulTemp ) )
|
|
return( FALSE );
|
|
pGuid->Data3 = ( USHORT )ulTemp;
|
|
|
|
// Fill in the first two characters in the 4th guid field
|
|
if( ! HexStrToULONG( &szString[19], 2, &ulTemp ) )
|
|
return( FALSE );
|
|
pGuid->Data4[0] = (unsigned char)ulTemp;
|
|
|
|
if( ! HexStrToULONG( &szString[21], 2, &ulTemp ) )
|
|
return( FALSE );
|
|
pGuid->Data4[1] = (unsigned char)ulTemp;
|
|
|
|
// Fill in the rest of the 4th guid field:
|
|
for( iCounter = 24, iIndex = 2;
|
|
( iCounter < 36 ) && ( iIndex < 8 );
|
|
iCounter += 2, ++iIndex )
|
|
{
|
|
if( ! HexStrToULONG( &szString[iCounter], 2, &ulTemp ) )
|
|
return( FALSE );
|
|
pGuid->Data4[iIndex] = (unsigned char)ulTemp;
|
|
}
|
|
|
|
return( TRUE );
|
|
} //StrToGuid
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: HexStrToULONG
|
|
//
|
|
// Synopsis: Uses strtoul to convert a string of hex digits to an
|
|
// unsigned long.
|
|
//
|
|
// Arguments: [szHexString] -- The string to convert
|
|
// [uiStopOffset] -- The number of digits to consider
|
|
// [pUlong] -- a pointer to the ULONG to fill in
|
|
//
|
|
// Returns: TRUE if successful, FALSE if the string cannot be converted
|
|
//
|
|
// History: 9-23-1996 ericne Created
|
|
//
|
|
// Notes: The main purpose of this function is to catch possible user
|
|
// typos of the form '-fff', where the leading hyphen could be
|
|
// misinterpreted by strtoul as a minus sign.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL HexStrToULONG( LPCTSTR szHexString, UINT uiStopOffset, ULONG *pUlong )
|
|
{
|
|
LPTSTR szStopString = NULL;
|
|
ULONG ulTemp = 0;
|
|
TCHAR szStringToChange[ MAX_LINE_SIZE ];
|
|
|
|
if( MAX_LINE_SIZE <= uiStopOffset )
|
|
{
|
|
printf( "ERROR in HexStrToULONG. uiStopOffset too large\r\n" );
|
|
return( FALSE );
|
|
}
|
|
|
|
// copy the part of the string to be converted into its own buffer
|
|
_tcsncpy( szStringToChange, szHexString, uiStopOffset );
|
|
szStringToChange[ uiStopOffset ] = '\0';
|
|
|
|
// First, make sure the leading character is not a '-'
|
|
if( _T('-') == *szStringToChange )
|
|
{
|
|
printf( "Parsing error: Unable to convert %s to unsigned long\r\n",
|
|
szStringToChange );
|
|
return( FALSE );
|
|
}
|
|
|
|
// Convert the string to an unsigned long
|
|
ulTemp = _tcstoul( szStringToChange, &szStopString, 16 );
|
|
|
|
// Make sure the stop offset is correct
|
|
if( szStopString != szStringToChange + uiStopOffset )
|
|
{
|
|
printf( "Parsing error: Unable to convert %s to unsigned long\r\n",
|
|
szStringToChange );
|
|
return( FALSE );
|
|
}
|
|
|
|
(*pUlong) = ulTemp;
|
|
|
|
return( TRUE );
|
|
|
|
} //HexStrToULONG
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: StrToPropspec
|
|
//
|
|
// Synopsis: converts a string to a PROPSPEC structure
|
|
//
|
|
// Arguments: [szString] -- the ANSI string
|
|
// [pPropspec] -- a pointer to the PROPSPEC structure
|
|
//
|
|
// Returns: TRUE if successful, FALSE if an error occurs.
|
|
//
|
|
// History: 9-23-1996 ericne Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
BOOL StrToPropspec( LPCTSTR szString, PROPSPEC *pPropspec )
|
|
{
|
|
UINT uiStringLength = _tcslen( szString );
|
|
ULONG ulTemp = 0;
|
|
|
|
// If " is the first and last char in the PropSpec buffer,
|
|
// treat it like a string.
|
|
if( _T('\"') == szString[0] && _T('\"') == szString[ uiStringLength - 1 ] )
|
|
{
|
|
pPropspec->ulKind = PRSPEC_LPWSTR;
|
|
|
|
// Allocate an array of wide characters:
|
|
pPropspec->lpwstr = NEW WCHAR[ uiStringLength - 1 ];
|
|
|
|
// Write the string into the buffer not including leading or trailing
|
|
// double-quotes
|
|
_snwprintf( pPropspec->lpwstr, uiStringLength - 2, L"%s", &szString[1]);
|
|
pPropspec->lpwstr[ uiStringLength - 2 ] = _T('\0');
|
|
}
|
|
// Otherwise, treat it like a propid
|
|
else
|
|
{
|
|
pPropspec->ulKind = PRSPEC_PROPID;
|
|
|
|
// Convert the propid string into a propid
|
|
if( ! HexStrToULONG( szString, uiStringLength, &ulTemp ) )
|
|
return( FALSE );
|
|
pPropspec->propid = ulTemp;
|
|
}
|
|
|
|
return( TRUE );
|
|
|
|
} //StrToPropspec
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Function: GetStringFromCLSID
|
|
//
|
|
// Synopsis: Converts a clsid (a.k.a. guid) to a string
|
|
//
|
|
// Arguments: [refclsid] --
|
|
// [szString] --
|
|
// [count] --
|
|
//
|
|
// Returns:
|
|
//
|
|
// History: 2-04-1997 ericne Created
|
|
//
|
|
// Notes:
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
LPTSTR GetStringFromCLSID( REFCLSID refclsid, LPTSTR szString, size_t count)
|
|
{
|
|
_sntprintf( szString, count,
|
|
_T("%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X"),
|
|
refclsid.Data1,
|
|
refclsid.Data2,
|
|
refclsid.Data3,
|
|
refclsid.Data4[0],
|
|
refclsid.Data4[1],
|
|
refclsid.Data4[2],
|
|
refclsid.Data4[3],
|
|
refclsid.Data4[4],
|
|
refclsid.Data4[5],
|
|
refclsid.Data4[6],
|
|
refclsid.Data4[7] );
|
|
|
|
return( szString );
|
|
|
|
} //GetStringFromCLSID
|
|
|
|
|