|
|
#define _LARGE_INTEGER_SUPPORT_
#include "stdafx.h"
#include "winnls.h"
#include "resource.h"
#include "errordlg.h"
typedef DWORD ( *LARGEINTTOSTRING )( LARGE_INTEGER*, ULONG, LONG, PSZ );
LARGEINTTOSTRING LargeIntegerToString;
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ ADSTYPE ADsTypeFromString( CString& strText ) { if( !strText.CompareNoCase( _T("ADSTYPE_DN_STRING") ) ) return ADSTYPE_DN_STRING;
if( !strText.CompareNoCase( _T("ADSTYPE_CASE_EXACT_STRING") ) ) return ADSTYPE_CASE_EXACT_STRING;
if( !strText.CompareNoCase( _T("ADSTYPE_CASE_IGNORE_STRING") ) ) return ADSTYPE_CASE_IGNORE_STRING;
if( !strText.CompareNoCase( _T("ADSTYPE_PRINTABLE_STRING") ) ) return ADSTYPE_PRINTABLE_STRING;
if( !strText.CompareNoCase( _T("ADSTYPE_NUMERIC_STRING") ) ) return ADSTYPE_NUMERIC_STRING;
if( !strText.CompareNoCase( _T("ADSTYPE_BOOLEAN") ) ) return ADSTYPE_BOOLEAN;
if( !strText.CompareNoCase( _T("ADSTYPE_INTEGER") ) ) return ADSTYPE_INTEGER;
if( !strText.CompareNoCase( _T("ADSTYPE_OCTET_STRING") ) ) return ADSTYPE_OCTET_STRING;
if( !strText.CompareNoCase( _T("ADSTYPE_UTC_TIME") ) ) return ADSTYPE_UTC_TIME;
if( !strText.CompareNoCase( _T("ADSTYPE_LARGE_INTEGER") ) ) return ADSTYPE_LARGE_INTEGER;
if( !strText.CompareNoCase( _T("ADSTYPE_PROV_SPECIFIC") ) ) return ADSTYPE_PROV_SPECIFIC;
if( !strText.CompareNoCase( _T("ADSTYPE_CASEIGNORE_LIST") ) ) return ADSTYPE_CASEIGNORE_LIST;
if( !strText.CompareNoCase( _T("ADSTYPE_POSTALADDRESS") ) ) return ADSTYPE_POSTALADDRESS;
if( !strText.CompareNoCase( _T("ADSTYPE_OCTET_LIST") ) ) return ADSTYPE_OCTET_LIST;
if( !strText.CompareNoCase( _T("ADSTYPE_PATH") ) ) return ADSTYPE_PATH;
if( !strText.CompareNoCase( _T("ADSTYPE_POSTALADDRESS") ) ) return ADSTYPE_POSTALADDRESS;
if( !strText.CompareNoCase( _T("ADSTYPE_TIMESTAMP") ) ) return ADSTYPE_TIMESTAMP;
if( !strText.CompareNoCase( _T("ADSTYPE_BACKLINK") ) ) return ADSTYPE_BACKLINK;
if( !strText.CompareNoCase( _T("ADSTYPE_TYPEDNAME") ) ) return ADSTYPE_TYPEDNAME;
if( !strText.CompareNoCase( _T("ADSTYPE_HOLD") ) ) return ADSTYPE_HOLD;
if( !strText.CompareNoCase( _T("ADSTYPE_NETADDRESS") ) ) return ADSTYPE_NETADDRESS;
if( !strText.CompareNoCase( _T("ADSTYPE_REPLICAPOINTER") ) ) return ADSTYPE_REPLICAPOINTER;
if( !strText.CompareNoCase( _T("ADSTYPE_FAXNUMBER") ) ) return ADSTYPE_FAXNUMBER;
if( !strText.CompareNoCase( _T("ADSTYPE_EMAIL") ) ) return ADSTYPE_EMAIL;
return ADSTYPE_INVALID; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ ADSTYPE ADsTypeFromSyntaxString( WCHAR* pszSyntax ) { ADSTYPE eType = ADSTYPE_CASE_IGNORE_STRING;
if( !_wcsicmp( pszSyntax, L"String" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"DN" ) ) { eType = ADSTYPE_DN_STRING; } else if( !_wcsicmp( pszSyntax, L"ObjectSecurityDescriptor" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"OID" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"Object Class" ) ) { eType = ADSTYPE_OBJECT_CLASS; } else if( !_wcsicmp( pszSyntax, L"DirectoryString" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"ORName" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"IA5String" ) ) { eType = ADSTYPE_NUMERIC_STRING; } else if( !_wcsicmp( pszSyntax, L"NumericString" ) ) { eType = ADSTYPE_NUMERIC_STRING; } else if( !_wcsicmp( pszSyntax, L"CaseIgnoreString" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"PrintableString" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"Counter" ) ) { eType = ADSTYPE_INTEGER; } else if( !_wcsicmp( pszSyntax, L"OleDsPath" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"Email" ) ) { eType = ADSTYPE_EMAIL; } else if( !_wcsicmp( pszSyntax, L"Hold" ) ) { eType = ADSTYPE_HOLD; } else if( !_wcsicmp( pszSyntax, L"Octet" ) ) { eType = ADSTYPE_OCTET_STRING; } else if( !_wcsicmp( pszSyntax, L"Back Link" ) ) { eType = ADSTYPE_BACKLINK; } else if( !_wcsicmp( pszSyntax, L"Typed Name" ) ) { eType = ADSTYPE_TYPEDNAME; } else if( !_wcsicmp( pszSyntax, L"EmailAddress" ) ) { eType = ADSTYPE_EMAIL; } else if( !_wcsicmp( pszSyntax, L"Path" ) ) { eType = ADSTYPE_PATH; } else if( !_wcsicmp( pszSyntax, L"Case Ignore List" ) ) { eType = ADSTYPE_CASEIGNORE_LIST; } else if( !_wcsicmp( pszSyntax, L"Octet List" ) ) { eType = ADSTYPE_OCTET_LIST; } else if( !_wcsicmp( pszSyntax, L"FaxNumber" ) ) { eType = ADSTYPE_FAXNUMBER; } else if( !_wcsicmp( pszSyntax, L"Integer" ) ) { eType = ADSTYPE_INTEGER; } else if( !_wcsicmp( pszSyntax, L"Integer8" ) ) { eType = ADSTYPE_LARGE_INTEGER; } else if( !_wcsicmp( pszSyntax, L"Postal Address" ) ) { eType = ADSTYPE_POSTALADDRESS; } else if( !_wcsicmp( pszSyntax, L"Interval" ) ) { eType = ADSTYPE_INTEGER; } else if( !_wcsicmp( pszSyntax, L"List" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"NetAddress" ) ) { eType = ADSTYPE_NETADDRESS; } else if( !_wcsicmp( pszSyntax, L"OctetString" ) ) { eType = ADSTYPE_OCTET_STRING; } else if( !_wcsicmp( pszSyntax, L"Path" ) ) { eType = ADSTYPE_PATH; } else if( !_wcsicmp( pszSyntax, L"PhoneNumber" ) ) { eType = ADSTYPE_CASE_IGNORE_STRING; } else if( !_wcsicmp( pszSyntax, L"PostalAddress" ) ) { eType = ADSTYPE_POSTALADDRESS; } else if( !_wcsicmp( pszSyntax, L"SmallInterval" ) ) { eType = ADSTYPE_INTEGER; } else if( !_wcsicmp( pszSyntax, L"Time" ) ) { eType = ADSTYPE_UTC_TIME; } else if( !_wcsicmp( pszSyntax, L"TimeStamp" ) ) { eType = ADSTYPE_TIMESTAMP; } else if( !_wcsicmp( pszSyntax, L"UTCTime" ) ) { eType = ADSTYPE_UTC_TIME; } else if( !_wcsicmp( pszSyntax, L"GeneralizedTime" ) ) { eType = ADSTYPE_UTC_TIME; } else if( !_wcsicmp( pszSyntax, L"boolean" ) ) { eType = ADSTYPE_BOOLEAN; } else { TCHAR szText[ 128 ];
Convert( szText, pszSyntax ); TRACE( _T("ERROR: unknown %s syntax\n"), szText ); //ASSERT( FALSE );
}
return eType; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CString StringFromADsType( ADSTYPE eType ) {
switch( eType ) { case ADSTYPE_DN_STRING: return CString( _T("ADSTYPE_DN_STRING") );
case ADSTYPE_CASE_EXACT_STRING: return CString( _T("ADSTYPE_CASE_EXACT_STRING") );
case ADSTYPE_CASE_IGNORE_STRING: return CString( _T("ADSTYPE_CASE_IGNORE_STRING") );
case ADSTYPE_PRINTABLE_STRING: return CString( _T("ADSTYPE_PRINTABLE_STRING") );
case ADSTYPE_NUMERIC_STRING: return CString( _T("ADSTYPE_NUMERIC_STRING") );
case ADSTYPE_BOOLEAN: return CString( _T("ADSTYPE_BOOLEAN") );
case ADSTYPE_INTEGER: return CString( _T("ADSTYPE_INTEGER") );
case ADSTYPE_OCTET_STRING: return CString( _T("ADSTYPE_OCTET_STRING") );
case ADSTYPE_UTC_TIME: return CString( _T("ADSTYPE_UTC_TIME") );
case ADSTYPE_LARGE_INTEGER: return CString( _T("ADSTYPE_LARGE_INTEGER") );
case ADSTYPE_PROV_SPECIFIC: return CString( _T("ADSTYPE_PROV_SPECIFIC") );
default: return CString( _T("ADSTYPE_UNKNOWN") );
} }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ DWORD TypeFromString( LPWSTR lpszBuffer ) { if( !lpszBuffer ) return OTHER;
if( !_wcsicmp( lpszBuffer, L"Namespace" ) ) return NAMESPACE;
if( !_wcsicmp( lpszBuffer, L"Namespaces" ) ) return NAMESPACES;
if( !_wcsicmp( lpszBuffer, L"User" ) ) return USER;
if( !_wcsicmp( lpszBuffer, L"Group" ) ) return GROUP;
if( !_wcsicmp( lpszBuffer, L"LocalGroup" ) ) return GROUP;
if( !_wcsicmp( lpszBuffer, L"GlobalGroup" ) ) return GROUP;
if( !_wcsicmp( lpszBuffer, L"groupofuniquenames" ) ) return GROUP;
if( !_wcsicmp( lpszBuffer, L"Domain" ) ) return DOMAIN;
if( !_wcsicmp( lpszBuffer, L"Computer" ) ) return COMPUTER;
if( !_wcsicmp( lpszBuffer, L"Service" ) ) return SERVICE;
if( !_wcsicmp( lpszBuffer, L"FileService" ) ) return FILESERVICE;
if( !_wcsicmp( lpszBuffer, L"Printqueue" ) ) return PRINTQUEUE;
if( !_wcsicmp( lpszBuffer, L"Printer" ) ) return PRINTER;
if( !_wcsicmp( lpszBuffer, L"Printjob" ) ) return PRINTJOB;
if( !_wcsicmp( lpszBuffer, L"PrintDevice" ) ) return PRINTDEVICE;
if( !_wcsicmp( lpszBuffer, L"Session" ) ) return SESSION;
if( !_wcsicmp( lpszBuffer, L"Resource" ) ) return RESOURCE;
if( !_wcsicmp( lpszBuffer, L"FileShare" ) ) return FILESHARE;
if( !_wcsicmp( lpszBuffer, L"Organization" ) ) return NDSORG;
if( !_wcsicmp( lpszBuffer, L"Root" ) ) return NDSROOT;
if( !_wcsicmp( lpszBuffer, L"Tree" ) ) return NDSROOT;
if( !_wcsicmp( lpszBuffer, L"Top" ) ) return NDSROOT;
if( !_wcsicmp( lpszBuffer, L"Organizational Unit" ) ) return NDSOU;
if( !_wcsicmp( lpszBuffer, L"OrganizationalUnit" ) ) return NDSOU;
if( !_wcsicmp( lpszBuffer, L"DomainOrganizationalUnit" ) ) return NDSOU;
if( !_wcsicmp( lpszBuffer, L"Alias" ) ) return NDSALIAS;
if( !_wcsicmp( lpszBuffer, L"Directory Map" ) ) return NDSDIRECTORYMAP;
if( !_wcsicmp( lpszBuffer, L"Distribution List" ) ) return NDSDISTRIBUTIONLIST;
if( !_wcsicmp( lpszBuffer, L"AFP Server" ) ) return NDSAFPSERVER;
if( !_wcsicmp( lpszBuffer, L"Communications Server" ) ) return NDSCOMMUNICATIONSSERVER;
if( !_wcsicmp( lpszBuffer, L"Message Routing Group" ) ) return NDSMESSAGEROUTINGGROUP;
if( !_wcsicmp( lpszBuffer, L"NCP Server" ) ) return NDSNETWARESERVER;
if( !_wcsicmp( lpszBuffer, L"Organizational Role" ) ) return NDSORGANIZATIONALROLE;
if( !_wcsicmp( lpszBuffer, L"Queue" ) ) return NDSPRINTQUEUE;
if( !_wcsicmp( lpszBuffer, L"Print Server" ) ) return NDSPRINTSERVER;
if( !_wcsicmp( lpszBuffer, L"Profile" ) ) return NDSPROFILE;
if( !_wcsicmp( lpszBuffer, L"Volume" ) ) return NDSVOLUME;
if( !_wcsicmp( lpszBuffer, L"Class" ) ) return CLASS;
if( !_wcsicmp( lpszBuffer, L"Schema" ) ) return SCHEMA;
if( !_wcsicmp( lpszBuffer, L"Syntax" ) ) return SYNTAX;
if( !_wcsicmp( lpszBuffer, L"Property" ) ) return PROPERTY;
return OTHER; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ DWORD TypeFromString( LPSTR lpszBuffer ) { int nLength; WCHAR* pszwType; DWORD dwType;
nLength = strlen( lpszBuffer );
pszwType = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) ); if ( pszwType ) { memset( pszwType, 0, ( nLength + 1 ) * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, lpszBuffer, nLength, pszwType, nLength + 1 ); } dwType = TypeFromString( pszwType ); if ( pszwType ) free( pszwType );
return dwType; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void StringFromType( DWORD dwType, CString& rString ) { TCHAR szText[ 128 ];
StringFromType( dwType, szText );
rString = szText; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void StringFromType( DWORD dwType, TCHAR* lpszBuffer ) { switch( dwType ) { case NAMESPACE: _tcscpy( lpszBuffer, _T("Namespace") ); break;
case NAMESPACES: _tcscpy( lpszBuffer, _T("Namespaces") ); break;
case USER: _tcscpy( lpszBuffer, _T("User") ); break;
case GROUP: _tcscpy( lpszBuffer, _T("Group") ); break;
case DOMAIN: _tcscpy( lpszBuffer, _T("Domain") ); break;
case COMPUTER: _tcscpy( lpszBuffer, _T("Computer") ); break;
case SERVICE: _tcscpy( lpszBuffer, _T("Service") ); break;
case FILESERVICE: _tcscpy( lpszBuffer, _T("FileService") ); break;
case PRINTQUEUE: _tcscpy( lpszBuffer, _T("Printqueue") ); break;
case PRINTER: _tcscpy( lpszBuffer, _T("Printer") ); break;
case PRINTJOB: _tcscpy( lpszBuffer, _T("PrintJob") ); break;
case PRINTDEVICE: _tcscpy( lpszBuffer, _T("PrintDevice") ); break;
case SESSION: _tcscpy( lpszBuffer, _T("Session") ); break;
case FILESHARE: _tcscpy( lpszBuffer, _T("FileShare") ); break;
case RESOURCE: _tcscpy( lpszBuffer, _T("Resource") ); break;
case NDSORG: _tcscpy( lpszBuffer, _T("Organization") ); break;
case NDSROOT: _tcscpy( lpszBuffer, _T("Tree") ); break;
case NDSOU: _tcscpy( lpszBuffer, _T("Organizational Unit") ); break;
case NDSALIAS: _tcscpy( lpszBuffer, _T("Alias") ); break;
case NDSDIRECTORYMAP: _tcscpy( lpszBuffer, _T("Directory Map") ); break;
case NDSDISTRIBUTIONLIST: _tcscpy( lpszBuffer, _T("Distribution List") ); break;
case NDSAFPSERVER: _tcscpy( lpszBuffer, _T("AFP Server") ); break;
case NDSCOMMUNICATIONSSERVER: _tcscpy( lpszBuffer, _T("Communications Server") ); break;
case NDSMESSAGEROUTINGGROUP: _tcscpy( lpszBuffer, _T("Message Routing Group") ); break;
case NDSNETWARESERVER: _tcscpy( lpszBuffer, _T("NCP Server") ); break;
case NDSORGANIZATIONALROLE: _tcscpy( lpszBuffer, _T("Organizational Role") ); break;
case NDSPRINTQUEUE: _tcscpy( lpszBuffer, _T("Queue") ); break;
case NDSPRINTSERVER: _tcscpy( lpszBuffer, _T("Print Server") ); break;
case NDSPROFILE: _tcscpy( lpszBuffer, _T("Profile") ); break;
case NDSVOLUME: _tcscpy( lpszBuffer, _T("Volume") ); break;
case SCHEMA: _tcscpy( lpszBuffer, _T("Schema") ); break;
case OTHER: _tcscpy( lpszBuffer, _T("Other") ); break;
case CLASS: _tcscpy( lpszBuffer, _T("Class") ); break;
case PROPERTY: _tcscpy( lpszBuffer, _T("Property") ); break;
case SYNTAX: _tcscpy( lpszBuffer, _T("Syntax") ); break;
default: ASSERT( FALSE ); _tcscpy( lpszBuffer, _T("") ); } }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL MakeQualifiedName( TCHAR* strDest, TCHAR* strName, DWORD dwType ) { TCHAR szTemp[ 128 ];
_tcscpy( strDest, strName );
if( OTHER == dwType ) return TRUE;
StringFromType( dwType, szTemp );
if( _tcslen( szTemp ) ) { _tcscat( strDest, _T(",") ); } _tcscat( strDest, szTemp );
return TRUE; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL MakeQualifiedName ( CString& strDest, CString& strName, DWORD dwType ) { TCHAR szTemp[ 128 ];
strDest = strName;
if( OTHER != dwType ) { StringFromType( dwType, szTemp ); strDest = strDest + _T(','); strDest = strDest + CString( szTemp ); }
return TRUE; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL TryThisFilter( BSTR bstrObjectType, MEMBERS* pIGroup ) { VARIANT v, varFilter, varOld; SAFEARRAY *psaTry = NULL; SAFEARRAYBOUND sabTryArray; HRESULT hr; long i;
sabTryArray.cElements = 1; sabTryArray.lLbound = LBOUND; psaTry = SafeArrayCreate( VT_VARIANT, 1, &sabTryArray );
if (!psaTry) { return FALSE; }
VariantInit(&v); V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString( bstrObjectType ); i = LBOUND; hr = SafeArrayPutElement( psaTry, (long FAR *)&i, &v );
while( TRUE ) { if( FAILED( hr ) ) break;
hr = pIGroup->get_Filter( &varOld ); if( FAILED( hr ) ) break;
VariantInit(&varFilter);
V_VT(&varFilter) = VT_VARIANT | VT_ARRAY; V_ARRAY( &varFilter) = psaTry; hr = pIGroup->put_Filter( varFilter ); if( FAILED( hr ) ) break;
hr = pIGroup->put_Filter( varOld ); ASSERT( SUCCEEDED( hr ) );
hr = VariantClear( &varOld ); ASSERT( SUCCEEDED( hr ) ); break; } SafeArrayDestroy( psaTry );
return SUCCEEDED( hr ); }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ HRESULT BuildFilter( BOOL* pFilters, DWORD dwFilters, VARIANT* pvarFilter ) { VARIANT varFilter; DWORD dwIter, dwCount, dwType; SAFEARRAY *psaFilter = NULL; HRESULT hResult; SAFEARRAYBOUND sabFilterArray; BSTR bstrTexts[ LIMIT ]; TCHAR szType[ 128 ];
dwCount = 0L;
for( dwType = 0L ; dwType < dwFilters ; dwType++ ) { if( OTHER == dwType ) continue;
if( pFilters[ dwType ] ) { StringFromType( dwType, szType ); bstrTexts[ dwCount++ ] = AllocBSTR( szType ); } }
sabFilterArray.cElements = dwCount; sabFilterArray.lLbound = LBOUND; psaFilter = SafeArrayCreate( VT_VARIANT, 1, &sabFilterArray );
if ( psaFilter ) { for( dwIter = LBOUND; dwIter < ( LBOUND + dwCount ); dwIter++ ) { VariantInit(&varFilter); V_VT(&varFilter) = VT_BSTR;
V_BSTR(&varFilter) = bstrTexts[ dwIter ]; hResult = SafeArrayPutElement( psaFilter, (long FAR *)&dwIter, &varFilter ); ASSERT( SUCCEEDED( hResult ) ); VariantClear( &varFilter ); }
V_VT(pvarFilter) = VT_VARIANT | VT_ARRAY; V_ARRAY(pvarFilter) = psaFilter; } else { hResult = E_OUTOFMEMORY ; }
// return SUCCEEDED( hResult );
return hResult ; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL SetFilter( IADsCollection* pIColl, BOOL* pFilters, DWORD dwFilters ) { VARIANT v; HRESULT hResult;
hResult = BuildFilter( pFilters, dwFilters, &v );
if( SUCCEEDED( hResult ) ) { /*hResult = pIColl->put_Filter( v );
if( FAILED( hResult ) ) { TRACE( _T( "ERROR! put_Filter failed") ); } */
VariantClear( &v ); }
return SUCCEEDED( hResult ); }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL SetFilter( MEMBERS* pIGroup, BOOL* pFilters, DWORD dwFilters ) { VARIANT v; HRESULT hResult;
hResult = BuildFilter( pFilters, dwFilters, &v );
if( SUCCEEDED( hResult ) ) { hResult = pIGroup->put_Filter( v ); if( FAILED( hResult ) ) { TRACE( _T( "ERROR! put_Filter failed") ); }
VariantClear( &v ); }
return SUCCEEDED( hResult ); }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL SetFilter( IADsContainer* pIContainer, BOOL* pFilters, DWORD dwFilters ) { VARIANT v; HRESULT hResult;
hResult = BuildFilter( pFilters, dwFilters, &v );
if( SUCCEEDED( hResult ) ) { hResult = pIContainer->put_Filter( v ); if( FAILED( hResult ) ) { TRACE( _T( "ERROR! put_Filter failed") ); }
VariantClear( &v ); }
return SUCCEEDED( hResult ); }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CString OleDsGetErrorText ( HRESULT hResult ) { TCHAR szText[ 128 ];
switch( hResult ) { case E_ADS_BAD_PATHNAME: return CString( _T("E_ADS_BAD_PATHNAME") ); break;
case E_ADS_INVALID_DOMAIN_OBJECT: return CString( _T("E_ADS_INVALID_DOMAIN_OBJECT") ); break;
case E_ADS_INVALID_USER_OBJECT: return CString( _T("E_ADS_INVALID_USER_OBJECT") ); break;
case E_ADS_INVALID_COMPUTER_OBJECT: return CString( _T("E_ADS_INVALID_COMPUTER_OBJECT") ); break;
case E_ADS_UNKNOWN_OBJECT: return CString( _T("E_ADS_UNKNOWN_OBJECT") ); break;
case E_ADS_PROPERTY_NOT_SET: return CString( _T("E_ADS_PROPERTY_NOT_SET") ); break;
case E_ADS_PROPERTY_NOT_SUPPORTED: return CString( _T("E_ADS_PROPERTY_NOT_SUPPORTED") ); break;
case E_ADS_PROPERTY_INVALID: return CString( _T("E_ADS_PROPERTY_INVALID") ); break;
case E_ADS_BAD_PARAMETER: return CString( _T("E_ADS_BAD_PARAMETER") ); break;
case E_ADS_OBJECT_UNBOUND: return CString( _T("E_ADS_OBJECT_UNBOUND") ); break;
case E_ADS_PROPERTY_NOT_MODIFIED: return CString( _T("E_ADS_PROPERTY_NOT_MODIFIED") ); break;
case E_ADS_PROPERTY_MODIFIED: return CString( _T("E_ADS_PROPERTY_MODIFIED") ); break;
case E_ADS_CANT_CONVERT_DATATYPE: return CString( _T("E_ADS_CANT_CONVERT_DATATYPE") ); break;
case E_ADS_PROPERTY_NOT_FOUND: return CString( _T("E_ADS_PROPERTY_NOTFOUND") ); break;
case E_ADS_OBJECT_EXISTS: return CString( _T("E_ADS_OBJECT_EXISTS") ); break;
case E_ADS_SCHEMA_VIOLATION: return CString( _T("E_ADS_SCHEMA_VIOLATION") ); break;
case E_ADS_COLUMN_NOT_SET: return CString( _T("E_ADS_COLUMN_NOT_SET") ); break;
case E_ADS_INVALID_FILTER: return CString( _T("E_ADS_INVALID_FILTER") ); break;
//case E_ADS_LDAP_BASE:
// return CString( _T("E_ADS_LDAP_BASE") );
// break;
case HRESULT_FROM_WIN32(ERROR_DS_OPERATIONS_ERROR): return CString( _T("ERROR_DS_OPERATIONS_ERROR") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_PROTOCOL_ERROR): return CString( _T("ERROR_DS_PROTOCOL_ERROR") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_TIMELIMIT_EXCEEDED): return CString( _T("ERROR_DS_TIMELIMIT_EXCEEDED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_SIZELIMIT_EXCEEDED): return CString( _T("ERROR_DS_SIZELIMIT_EXCEEDED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_COMPARE_FALSE): return CString( _T("ERROR_DS_COMPARE_FALSE") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_COMPARE_TRUE): return CString( _T("ERROR_DS_COMPARE_TRUE") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_AUTH_METHOD_NOT_SUPPORTED): return CString( _T("ERROR_DS_AUTH_METHOD_NOT_SUPPORTED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_STRONG_AUTH_REQUIRED): return CString( _T("ERROR_DS_STRONG_AUTH_REQUIRED") ); break;
case HRESULT_FROM_WIN32(ERROR_MORE_DATA): return CString( _T("ERROR_MORE_DATA") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_REFERRAL): return CString( _T("(ERROR_DS_REFERRAL") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_ADMIN_LIMIT_EXCEEDED): return CString( _T("ERROR_DS_ADMIN_LIMIT_EXCEEDED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION): return CString( _T("(ERROR_DS_UNAVAILABLE_CRIT_EXTENSION") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED): return CString( _T("HRESULT_FROM_WIN32(ERROR_DS_CONFIDENTIALITY_REQUIRED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_NO_ATTRIBUTE_OR_VALUE): return CString( _T("ERROR_DS_NO_ATTRIBUTE_OR_VALUE") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED): return CString( _T("(ERROR_DS_ATTRIBUTE_TYPE_UNDEFINED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_MATCHING): return CString( _T("(ERROR_DS_INAPPROPRIATE_MATCHING") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_CONSTRAINT_VIOLATION): return CString( _T("ERROR_DS_CONSTRAINT_VIOLATION") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS): return CString( _T("ERROR_DS_ATTRIBUTE_OR_VALUE_EXISTS") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_INVALID_ATTRIBUTE_SYNTAX): return CString( _T("ERROR_DS_INVALID_ATTRIBUTE_SYNTAX") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_NO_SUCH_OBJECT): return CString( _T("ERROR_DS_NO_SUCH_OBJECT") ); break;
// case HRESULT_FROM_WIN32(E_ADS_LDAP_ALIAS_PROBLEM:
// return CString( _T("HRESULT_FROM_WIN32(E_ADS_LDAP_ALIAS_PROBLEM") );
// break;
case HRESULT_FROM_WIN32(ERROR_DS_INVALID_DN_SYNTAX): return CString( _T("(ERROR_DS_INVALID_DN_SYNTAX") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_IS_LEAF): return CString( _T("(ERROR_DS_IS_LEAF") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_ALIAS_DEREF_PROBLEM): return CString( _T("(ERROR_DS_ALIAS_DEREF_PROBLEM") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_INAPPROPRIATE_AUTH): return CString( _T("(ERROR_DS_INAPPROPRIATE_AUTH") ); break;
case HRESULT_FROM_WIN32(ERROR_INVALID_PASSWORD): return CString( _T("(ERROR_INVALID_PASSWORD") ); break;
case HRESULT_FROM_WIN32(ERROR_ACCESS_DENIED): return CString( _T("ERROR_ACCESS_DENIED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_BUSY): return CString( _T("ERROR_DS_BUSY") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_UNAVAILABLE): return CString( _T("ERROR_DS_UNAVAILABLE") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_UNWILLING_TO_PERFORM): return CString( _T("ERROR_DS_UNWILLING_TO_PERFORM") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_LOOP_DETECT): return CString( _T("ERROR_DS_LOOP_DETECT") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_NAMING_VIOLATION): return CString( _T("ERROR_DS_NAMING_VIOLATION") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_OBJ_CLASS_VIOLATION): return CString( _T("ERROR_DS_OBJ_CLASS_VIOLATION") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_NON_LEAF): return CString( _T("ERROR_DS_CANT_ON_NONLEAF") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_CANT_ON_RDN): return CString( _T("ERROR_DS_CANT_ON_RDN") ); break;
case HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS): return CString( _T("ERROR_ALREADY_EXISTS") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_CANT_MOD_OBJ_CLASS): return CString( _T("ERROR_DS_CANT_MOD_OBJ_CLASS") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_OBJECT_RESULTS_TOO_LARGE): return CString( _T("ERROR_DS_OBJECT_RESULTS_TOO_LARGE") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_AFFECTS_MULTIPLE_DSAS): return CString( _T("ERROR_DS_AFFECTS_MULTIPLE_DSAS") ); break;
case HRESULT_FROM_WIN32(ERROR_GEN_FAILURE): return CString( _T("(ERROR_GEN_FAILURE") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_SERVER_DOWN): return CString( _T("ERROR_DS_SERVER_DOWN") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_LOCAL_ERROR): return CString( _T("ERROR_DS_LOCAL_ERROR") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_ENCODING_ERROR): return CString( _T("ERROR_DS_ENCODING_ERROR") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_DECODING_ERROR): return CString( _T("(ERROR_DS_DECODING_ERROR") ); break;
case HRESULT_FROM_WIN32(ERROR_TIMEOUT): return CString( _T("(ERROR_TIMEOUT") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_AUTH_UNKNOWN): return CString( _T("ERROR_DS_AUTH_UNKNOWN") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_FILTER_UNKNOWN): return CString( _T("(ERROR_DS_FILTER_UNKNOWN") ); break;
case HRESULT_FROM_WIN32(ERROR_CANCELLED): return CString( _T("(ERROR_CANCELLED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_PARAM_ERROR): return CString( _T("ERROR_DS_PARAM_ERROR") ); break;
case HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY): return CString( _T("ERROR_NOT_ENOUGH_MEMORY") ); break;
case HRESULT_FROM_WIN32(ERROR_CONNECTION_REFUSED): return CString( _T("ERROR_CONNECTION_REFUSED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_NOT_SUPPORTED): return CString( _T("ERROR_DS_NOT_SUPPORTED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_NO_RESULTS_RETURNED): return CString( _T("ERROR_DS_NO_RESULTS_RETURNED") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_CONTROL_NOT_FOUND): return CString( _T("ERROR_DS_CONTROL_NOT_FOUND") ); break;
// case HRESULT_FROM_WIN32(E_ADS_LDAP_MORE_RESULTS_TO_RETURN:
// return CString( _T("HRESULT_FROM_WIN32(E_ADS_LDAP_MORE_RESULTS_TO_RETURN") );
// break;
case HRESULT_FROM_WIN32(ERROR_DS_CLIENT_LOOP): return CString( _T("(ERROR_DS_CLIENT_LOOP") ); break;
case HRESULT_FROM_WIN32(ERROR_DS_REFERRAL_LIMIT_EXCEEDED): return CString( _T("ERROR_DS_REFERRAL_LIMIT_EXCEEDED") ); break;
// case HRESULT_FROM_WIN32(E_ADS_LDAP_LAST:
// return CString( _T("HRESULT_FROM_WIN32(E_ADS_LDAP_LAST") );
// break;
case E_FAIL: return CString( _T("E_FAIL") ); break;
case E_NOTIMPL: return CString( _T("E_NOIMPL") ); break;
case S_OK: return CString( _T("OK") ); break;
case 0x800704b8: // we have an extended error
{ TCHAR szError[ 1024 ]; WCHAR szErrorBuff[ 1024 ]; WCHAR szNameBuff[ 1024 ]; DWORD dwError;
ADsGetLastError( &dwError, szErrorBuff, 1023, szNameBuff, 1023 ); wcscat( szNameBuff, L" : " ); wcscat( szNameBuff, szErrorBuff );
_tcscpy( szError, _T("ERROR: ") ); Convert( szError + _tcslen( szError ), szNameBuff );
return CString( szError ); }
default: { LPVOID lpMsgBuf; UINT nChars;
nChars = FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, SCODE_CODE(hResult), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
(LPTSTR) &lpMsgBuf, 0, NULL );
if( nChars ) { if( nChars != _tcslen( (LPTSTR)lpMsgBuf ) ) { ((LPTSTR)lpMsgBuf)[nChars] = _T('\0'); } wsprintf( szText, _T("ERROR: %lx - %s"), hResult, (LPTSTR)lpMsgBuf ); LocalFree( lpMsgBuf );
} else { DWORD dwLastError;
wsprintf( szText, _T("ERROR: %lx"), hResult ); dwLastError = GetLastError(); } return CString( szText ); break; } } }
/***********************************************************
Function: BuildVariantArray Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ HRESULT BuildVariantArray( VARTYPE vType, CString& rText, VARIANT& varRes, TCHAR cSeparator ) { VARIANT vTemp, vTyped; SAFEARRAY* psa; SAFEARRAYBOUND sab; CStringArray strArray; TCHAR* strText; int nItems = 0; int nIdx; int nSize; LPTSTR lpName; HRESULT hResult;
strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ];
if( !strText ) { return E_FAIL; }
if( VT_I8 == vType ) { vType = VT_R8; }
_tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) );
nSize = rText.GetLength( ); nItems = nSize ? 1 : 0; for( nIdx = 0; nIdx < nSize ; nIdx++ ) { if( strText[ nIdx ] == cSeparator ) { nItems++; strText[ nIdx ] = _T('\0'); } }
sab.cElements = nItems; sab.lLbound = LBOUND; psa = SafeArrayCreate( VT_VARIANT, 1, &sab );
ASSERT( NULL != psa );
if ( psa ) {
lpName = strText; for( nIdx = LBOUND; nIdx < ( LBOUND + nItems ) ; nIdx++ ) { while( *lpName == _T(' ') ) { lpName++; }
VariantInit( &vTemp ); V_VT(&vTemp) = VT_BSTR;
V_BSTR(&vTemp) = AllocBSTR( lpName ); lpName = lpName + ( _tcslen( lpName ) + 1 );
VariantInit( &vTyped ); hResult = VariantChangeType( &vTyped, &vTemp, VARIANT_NOVALUEPROP, vType );
hResult = SafeArrayPutElement( psa, (long FAR *)&nIdx, &vTyped );
VariantClear( &vTyped ); VariantClear( &vTemp ); ASSERT( SUCCEEDED( hResult ) ); }
V_VT( &varRes ) = VT_VARIANT | VT_ARRAY; V_ARRAY( &varRes ) = psa; } else { hResult = E_OUTOFMEMORY ; } ;
delete [] strText;
//return SUCCEEDED( hResult );
return hResult ;
}
/***********************************************************
Function: FromVariantArrayToString Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CString FromVariantArrayToString( VARIANT& v, TCHAR* pszSeparator ) { SAFEARRAY* pSafeArray; TCHAR szText[ 2048 ]; VARIANT var, varString; long lBound, uBound, lItem; HRESULT hResult; BOOL bFirst; CString strResult;
// array of VT_UI1 (probably OctetString)
if( (VT_ARRAY | VT_UI1) == V_VT( &v ) ) { BYTE bValue;
pSafeArray = V_ARRAY( &v );
hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound); hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound);
szText[ 0 ] = _T('\0');
for( lItem = lBound; lItem <= uBound ; lItem++ ) { hResult = SafeArrayGetElement( pSafeArray, &lItem, &bValue ); if( FAILED( hResult ) ) { break; }
_stprintf( szText + _tcslen(szText), _T(" x%02x"), bValue ); if( _tcslen( szText ) > 2044 ) break; }
return CString( szText ); }
if( V_VT( &v ) != (VT_VARIANT | VT_ARRAY) ) { VARIANT vString;
TRACE( _T("Warning: Non array variant!!!\n") ); VariantInit( &vString );
hResult = VariantChangeType( &vString, &v, VARIANT_NOVALUEPROP, VT_BSTR ); if( FAILED( hResult ) ) { V_VT( &vString ) = VT_BSTR; V_BSTR( &vString ) = AllocBSTR( _T("ERROR on conversion") ); } _tcscpy( szText, _T("") ); StringCat( szText, V_BSTR(&vString) ); VariantClear( &vString);
return CString( szText ); }
pSafeArray = V_ARRAY( &v );
hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound); hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound);
VariantInit( &varString ); szText[ 0 ] = _T('\0'); bFirst = TRUE;
for( lItem = lBound; lItem <= uBound ; lItem++ ) { hResult = SafeArrayGetElement( pSafeArray, &lItem, &var ); if( FAILED( hResult ) ) { break; }
if( ConvertFromPropertyValue( var, szText ) ) { V_VT( &varString ) = VT_BSTR; V_BSTR( &varString ) = AllocBSTR( szText ); hResult = S_OK; } else { hResult = VariantChangeType( &varString, &var, VARIANT_NOVALUEPROP, VT_BSTR ); }
if( SUCCEEDED( hResult ) ) { _tcscpy( szText, _T("") ); if( !bFirst ) { if( NULL == pszSeparator ) { _tcscat( szText, SEPARATOR_S ); } else { _tcscat( szText, pszSeparator ); } }
StringCat( szText, V_BSTR( &varString ) );
bFirst = FALSE; VariantClear( &varString );
strResult += szText; }
VariantClear( &var ); }
return strResult; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ CString FromVariantToString( VARIANT& v) { return FromVariantArrayToString( v ); }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ COleDsObject* CreateOleDsObject( DWORD dwType, IUnknown* pIUnk ) { COleDsObject* pObject;
switch( dwType ) { case DOMAIN: pObject = new COleDsDomain( pIUnk ); break;
case COMPUTER: pObject = new COleDsComputer( pIUnk ); break;
case USER: pObject = new COleDsUser( pIUnk ); break;
case GROUP: pObject = new COleDsGroup( pIUnk ); break;
case SERVICE: pObject = new COleDsService( pIUnk ); break;
case FILESERVICE: pObject = new COleDsFileService( pIUnk ); break;
case PRINTQUEUE: pObject = new COleDsPrintQueue( pIUnk ); break;
case PRINTJOB: pObject = new COleDsPrintJob( pIUnk ); break;
case PRINTDEVICE: pObject = new COleDsPrintDevice( pIUnk ); break;
case SESSION: pObject = new COleDsSession( pIUnk ); break;
case FILESHARE: pObject = new COleDsFileShare( pIUnk ); break;
case RESOURCE: pObject = new COleDsResource( pIUnk ); break;
case NAMESPACE: pObject = new COleDsNamespace( pIUnk ); break;
case NAMESPACES: pObject = new COleDsNamespaces( pIUnk ); break; case NDSROOT: case NDSORG: case NDSOU: case PRINTER: case NDSALIAS: case NDSDIRECTORYMAP: case NDSDISTRIBUTIONLIST: case NDSAFPSERVER: case NDSCOMMUNICATIONSSERVER: case NDSMESSAGEROUTINGGROUP: case NDSNETWARESERVER: case NDSORGANIZATIONALROLE: case NDSPRINTQUEUE: case NDSPRINTSERVER: case NDSPROFILE: case NDSVOLUME: case OTHER: case CLASS: case SCHEMA: case PROPERTY: case SYNTAX: pObject = new COleDsGeneric( pIUnk ); break;
default: ASSERT( FALSE ); pObject = new COleDsObject( pIUnk ); break;
}
return pObject; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ void ErrorOnPutProperty( CString& strFuncSet, CString& strProperty, CString& strPropValue, HRESULT hResult, BOOL bGeneric, BOOL bUseEx ) { CErrorDialog aErrorDialog; CString strOperation;
if( !bGeneric ) { strOperation = _T("put_"); strOperation += strProperty; } else { strOperation = _T("Put"); if( bUseEx ) { strOperation += _T("Ex"); } strOperation += _T("( "); strOperation += strProperty; strOperation += _T(", ...)"); }
//aErrorDialog.m_FuncSet = strFuncSet;
aErrorDialog.m_Operation = strOperation; aErrorDialog.m_Value = strPropValue; aErrorDialog.m_Result = OleDsGetErrorText( hResult );
aErrorDialog.DoModal( ); }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL CheckIfValidClassName( WCHAR* lpszClassName ) { TCHAR szClassName[ 512 ]; BSTR bszClassName = NULL ;
if( !lpszClassName ) { TRACE( _T("Oops! Found NULL class name: %s\n"), lpszClassName ); return TRUE; }
if( !_wcsicmp( lpszClassName, L"Namespace") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Namespaces") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"User") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Group") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Domain") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Computer") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Service") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"FileService") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Printqueue") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Printjob") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"PrintDevice") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Session") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Resource") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"FileShare") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Tree") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Organization") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Organizational Unit") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"OrganizationalUnit") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Printer") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Class") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Property") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Syntax") ) return TRUE;
if( !_wcsicmp( lpszClassName, L"Schema") ) return TRUE;
_tcscpy( szClassName, _T("") ); bszClassName = ::SysAllocString( lpszClassName ) ; StringCat( szClassName, bszClassName ); if ( bszClassName ) { ::SysFreeString( bszClassName ) ; }
TRACE( _T("Oops! Found unknown class name: %s\n"), szClassName );
return TRUE; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BOOL CheckIfValidClassName( CHAR* pszClassName ) { int nLength; WCHAR* pszwClassName; BOOL bRez = FALSE ;
nLength = strlen( pszClassName );
pszwClassName = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) ); if ( pszwClassName ) { memset( pszwClassName, 0, ( nLength + 1 ) * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszClassName, nLength, pszwClassName, nLength + 1 );
bRez = CheckIfValidClassName( pszwClassName );
free( pszwClassName ); }
return bRez;
return TRUE; }
/***********************************************************
Function: Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ int GetImageListIndex( DWORD dwObjectType ) { int nIndex;
nIndex = 0; dwObjectType = dwObjectType >> 1; while( dwObjectType ) { nIndex++; dwObjectType = dwObjectType >> 1; }
return nIndex; }
/***********************************************************
Function: GetBitmapImageId Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ UINT GetBitmapImageId( DWORD dwObjectType ) { switch( dwObjectType ) { case USER: return IDB_USER;
case SERVICE: return IDB_SERVICE;
case DOMAIN: return IDB_DOMAIN;
case COMPUTER: return IDB_COMPUTER;
case PRINTQUEUE: case PRINTER: return IDB_PRINTQUEUE;
case FILESHARE: return IDB_FILESHARE;
case GROUP: return IDB_GROUP;
case SESSION: return IDB_SESSION;
case RESOURCE: return IDB_RESOURCE;
case PRINTJOB: return IDB_PRINTJOB;
case NDSROOT: return IDB_ROOT;
case NDSORG: return IDB_ORGANISATION;
case NDSOU: return IDB_ORGANISATIONUNIT;
case NAMESPACES: return IDB_NAMESPACES;
case NAMESPACE: return IDB_NAMESPACE;
case NDSALIAS: return IDB_NDS_ALIAS;
case NDSDIRECTORYMAP: return IDB_NDS_DIRECTORY_MAP;
case NDSDISTRIBUTIONLIST: return IDB_NDS_DISTRIBUTION_LIST;
case NDSAFPSERVER: return IDB_NDS_AFP_SERVER;
case NDSCOMMUNICATIONSSERVER: return IDB_NDS_COMMUNICATIONS_SERVER;
case NDSMESSAGEROUTINGGROUP: return IDB_NDS_MESSAGE_ROUTING_GROUP;
case NDSNETWARESERVER: return IDB_NDS_NETWARE_SERVER;
case NDSORGANIZATIONALROLE: return IDB_NDS_ORGANIZATIONAL_ROLE;
case NDSPRINTQUEUE: return IDB_NDS_PRINT_QUEUE;
case NDSPRINTSERVER: return IDB_NDS_PRINT_SERVER;
case NDSPROFILE: return IDB_NDS_PROFILE;
case NDSVOLUME: return IDB_NDS_VOLUME;
case SYNTAX: return IDB_SYNTAX;
case PROPERTY: return IDB_PROPERTY;
case CLASS: case SCHEMA: return IDB_CLASS;
default: return IDB_DUMMY; } }
/***********************************************************
Function: AllocBSTR Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BSTR AllocBSTR( WCHAR* pszwString ) { return SysAllocString( pszwString ); }
/***********************************************************
Function: AllocBSTR Arguments: Return: Purpose: Author(s): Revision: Date: ***********************************************************/ BSTR AllocBSTR( CHAR* pszString ) { int nLength; WCHAR* pszwString; BSTR bstrText;
nLength = strlen( pszString );
pszwString = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) );
if ( pszwString ) { memset( pszwString, 0, ( nLength + 1 ) * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszString, nLength, pszwString, nLength + 1 ); } bstrText = AllocBSTR( pszwString ); if ( pszwString ) { free( pszwString ); }
return bstrText; }
/*******************************************************************
Function: Get Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT Get( IADs* pIOleDs, CHAR* pszProperty, VARIANT* pVar) { int nLength; WCHAR* pszwProperty; HRESULT hResult;
nLength = strlen( pszProperty );
pszwProperty = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) ); if ( pszwProperty ) { memset( pszwProperty, 0, ( nLength + 1 ) * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszProperty, nLength, pszwProperty, nLength + 1 );
hResult = Get( pIOleDs, pszwProperty, pVar ); free( pszwProperty ); } else { hResult = E_OUTOFMEMORY ; }
return hResult; }
/*******************************************************************
Function: Get Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT Get( IADs* pIOleDs, WCHAR* pszwProperty, VARIANT* pVar) { HRESULT hResult; BSTR bszProperty = ::SysAllocString( pszwProperty ) ;
VariantInit( pVar );
hResult = pIOleDs->Get( bszProperty, pVar ); if ( bszProperty ) { ::SysFreeString( bszProperty ) ; }
return hResult; }
/*******************************************************************
Function: Put Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT Put( IADs* pIOleDs, CHAR* pszProperty, VARIANT Var) { int nLength; WCHAR* pszwProperty; HRESULT hResult;
nLength = strlen( pszProperty );
pszwProperty = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) ); if ( pszwProperty ) { memset( pszwProperty, 0, ( nLength + 1 ) * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszProperty, nLength, pszwProperty, nLength + 1 );
hResult = Put( pIOleDs, pszwProperty, Var ) ; free( pszwProperty ); } else { hResult = E_OUTOFMEMORY ; } ;
return hResult; }
/*******************************************************************
Function: Put Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT Put( IADs* pIOleDs, WCHAR* pszwProperty, VARIANT Var) { HRESULT hResult; BSTR bszProperty = ::SysAllocString( pszwProperty ) ; hResult = pIOleDs->Put( bszProperty, Var ); if ( bszProperty ) { ::SysFreeString( bszProperty ) ; }
return hResult; }
/*******************************************************************
Function: XGetOleDsObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT XOleDsGetObject( WCHAR* pszwPath, REFIID refiid, void** pVoid ) { // cahged to add the hack for Win95.
HRESULT hResult;
hResult = ADsGetObject( pszwPath, refiid, pVoid ); if( FAILED( hResult ) ) { // now's the hack.
// Danilo says take OLE DS paths and prepent a "@"
// to and change the first ":" into a "!"
WCHAR szHackPath[ 256 ];
// first, add @
wcscpy( szHackPath, L"@" ); wcscat( szHackPath, pszwPath );
// second, change the first ":" into a "!"
for( UINT nIdx = 0 ; nIdx < wcslen( szHackPath ); nIdx++ ) { if( szHackPath[ nIdx ] == L':' ) { szHackPath[ nIdx ] = L'!'; break; } }
hResult = ADsGetObject( szHackPath, refiid, pVoid ); }
return hResult; }
/*******************************************************************
Function: XGetOleDsObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT XOleDsGetObject( CHAR* pszPath, REFIID refiid, void** pVoid ) { int nLength; WCHAR* pszwPath; HRESULT hResult;
nLength = strlen( pszPath );
pszwPath = (WCHAR*) malloc( ( nLength + 1 ) * sizeof(WCHAR) ); if ( pszwPath ) { memset( pszwPath, 0, ( nLength + 1 ) * sizeof(WCHAR) );
MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, pszPath, nLength, pszwPath, nLength + 1 );
hResult = XOleDsGetObject( pszwPath, refiid, pVoid ); free( pszwPath ); } else { hResult = E_OUTOFMEMORY ; }
return hResult; }
/*******************************************************************
Function: XOleDsOpenObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT XOleDsOpenObject( WCHAR* lpszPathName, WCHAR* lpszUserName, WCHAR* lpszPassword, REFIID refiid, void** pVoid ) { HRESULT hResult;
hResult = ADsOpenObject( lpszPathName, lpszUserName, lpszPassword, NULL, refiid, pVoid ); if( FAILED( hResult ) ) { // now's the hack.
// Danilo says take OLE DS paths and prepent a "@"
// to and change the first ":" into a "!"
WCHAR szHackPath[ 256 ];
// first, add @
wcscpy( szHackPath, L"@" ); wcscat( szHackPath, lpszPathName );
// second, change the first ":" into a "!"
for( UINT nIdx = 0 ; nIdx < wcslen( szHackPath ); nIdx++ ) { if( szHackPath[ nIdx ] == L':' ) { szHackPath[ nIdx ] = L'!'; break; } } hResult = ADsOpenObject( szHackPath, lpszUserName, lpszPassword, NULL, refiid, pVoid ); }
return hResult; }
/*******************************************************************
Function: XOleDsOpenObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT XOleDsOpenObject( CHAR* lpszPathName, CHAR* lpszUserName, CHAR* lpszPassword, REFIID refiid, void** pVoid ) { BSTR bstrPathName, bstrUserName, bstrPassword; HRESULT hResult;
bstrPathName = AllocBSTR( lpszPathName ); bstrUserName = AllocBSTR( lpszUserName ); bstrPassword = AllocBSTR( lpszPassword );
hResult = XOleDsOpenObject( bstrPathName, bstrUserName, bstrPassword, refiid, pVoid );
SysFreeString( bstrPathName ); SysFreeString( bstrUserName ); SysFreeString( bstrPassword );
return hResult; }
/*******************************************************************
Function: StringCat Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ void StringCat( WCHAR* pszString, BSTR bstrText ) { wcscat( pszString, bstrText ); }
/*******************************************************************
Function: StringCat Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ void StringCat( CHAR* pszString, BSTR bstrText ) { CHAR* pszText; UINT nLength; CHAR defChar = ' '; BOOL bUseDefault; int nRez; DWORD dwError;
nLength = SysStringLen( bstrText ); pszText = (CHAR*) malloc( (nLength + 1) * sizeof(CHAR) ); if ( pszText ) { memset( pszText, 0, (nLength + 1) * sizeof(CHAR) );
nRez = WideCharToMultiByte( CP_ACP, 0L, bstrText, nLength, pszText, nLength + 1, &defChar, &bUseDefault ); if( !nRez ) { dwError = GetLastError( ); }
strcat( pszString, pszText ); }
free( pszText ); }
/*******************************************************************
Function: XGetOleDsObject Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ void SetLastProfileString( TCHAR* szSection, CString& rValue ) { WritePrivateProfileString( _T("LastParameters"), szSection, rValue.GetBuffer( 256 ), _T("adsvw.ini") ); }
/*******************************************************************
Function: SetLastProfileString Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ void GetLastProfileString( TCHAR* szSection, CString& rValue ) { TCHAR szValue[ 256 ];
GetPrivateProfileString( _T("LastParameters"), szSection, _T(""), szValue, 255, _T("adsvw.ini") );
rValue = szValue; }
/*******************************************************************
Function: GetByteValue Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ BYTE GetByteValue( TCHAR* szString ) { BYTE bBytes[ 2 ];
bBytes[ 0 ] = bBytes[ 1 ] = 0;
for( int i = 0; i < 2 ; i++ ) { if( !szString[ i ] ) break;
#ifdef UNICODE
if( !iswdigit( szString[ i ] ) ) { bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x37; } #else
if( !isdigit( szString[ i ] ) ) { bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x37; } #endif
else { bBytes[ i ] = ( (BYTE) ( szString[ i ] ) ) - 0x30; } }
return ( bBytes[ 0 ] << 4 ) + bBytes[ 1 ]; }
/*******************************************************************
Function: CreateBlobArray Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT CreateBlobArrayFromFile( CString& rText, VARIANT& rBlob ) { TCHAR* pszFileName; TCHAR pszTemp[ 2 * MAX_PATH ]; CFile aFile; CFileException e;
rText.TrimLeft( );
_tcscpy( pszTemp, (LPCTSTR)rText ); pszFileName = pszTemp;
pszFileName += _tcslen( _T("[FILE]") ); while( *pszFileName == _T(' ') ) pszFileName++;
if( !aFile.Open( pszFileName, CFile::modeRead, &e ) ) {
#ifdef _DEBUG
afxDump << "File could not be opened " << e.m_cause << "\n"; #endif
} else { SAFEARRAY* psa; SAFEARRAYBOUND sab; LONG lItem; DWORD dwIdx; DWORD dwRead; HRESULT hResult; BYTE bBuffer[ 128 ];
sab.cElements = (ULONG)(aFile.GetLength( )); sab.lLbound = LBOUND; psa = SafeArrayCreate( VT_UI1, 1, &sab ); lItem = LBOUND;
while( TRUE ) { dwRead = aFile.Read( (LPVOID)bBuffer, 128 );
for( dwIdx = 0; dwIdx < dwRead ; dwIdx++ ) { hResult = SafeArrayPutElement( psa, &lItem, bBuffer + dwIdx ); ASSERT( SUCCEEDED( hResult ) ); } if( dwRead != 128 ) break; }
V_VT( &rBlob ) = VT_UI1 | VT_ARRAY; V_ARRAY( &rBlob ) = psa;
aFile.Close( ); }
return S_OK; }
/*******************************************************************
Function: CreateBlobArray Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT CreateBlobArray( CString& rText, VARIANT& rBlob ) { SAFEARRAY* psa; SAFEARRAYBOUND sab; TCHAR* strText; int nItems = 0; int nIdx; int nSize; HRESULT hResult; BYTE bVal;
rText.MakeUpper( ); rText.TrimLeft( );
if( !_tcsnicmp( (LPCTSTR)rText, _T("[FILE]"), min( (int)rText.GetLength( ), (int)_tcslen( _T("[FILE]") ) ) ) ) { hResult = CreateBlobArrayFromFile( rText, rBlob ); return hResult; }
strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ]; if( !strText ) { return E_FAIL; }
_tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) ); nSize = rText.GetLength( ); nItems = 0; for( nIdx = 0; nIdx < nSize ; nIdx++ ) { if( strText[ nIdx ] == _T('X') ) { nItems++; } }
sab.cElements = nItems; sab.lLbound = LBOUND; psa = SafeArrayCreate( VT_UI1, 1, &sab ); ASSERT( NULL != psa ); if ( psa ) { nItems = 0;
for( nIdx = LBOUND; nIdx < ( LBOUND + nSize ); nIdx++ ) { if( strText[ nIdx ] == _T('X') ) { bVal = GetByteValue( strText + nIdx + 1 ); hResult = SafeArrayPutElement( psa, (long FAR *)&nItems, &bVal ); nIdx += 3; nItems++; } } V_VT( &rBlob ) = VT_UI1 | VT_ARRAY; V_ARRAY( &rBlob ) = psa; }
delete [] strText;
return hResult; }
/*******************************************************************
Function: CreateBlobArrayEx Arguments: Return: Purpose: Author(s): Revision: Date: *******************************************************************/ HRESULT CreateBlobArrayEx( CString& rText, VARIANT& rBlob, TCHAR cSeparator ) { SAFEARRAY* psa; SAFEARRAYBOUND sab; TCHAR* strText; TCHAR* strStore; int nItems = 0; int nIdx; int nSize; HRESULT hResult;
rText.MakeUpper( );
strText = (TCHAR*) new TCHAR[ rText.GetLength( ) + 1 ]; strStore = strText; if( !strText ) { return E_FAIL; }
_tcscpy( strText, rText.GetBuffer( rText.GetLength( ) ) ); nSize = rText.GetLength( ); nItems = 1; for( nIdx = 0; nIdx < nSize ; nIdx++ ) { if( strText[ nIdx ] == cSeparator ) { strText[ nIdx ] = _T('\0'); nItems++; } }
sab.cElements = nItems; sab.lLbound = LBOUND; psa = SafeArrayCreate( VT_VARIANT, 1, &sab ); ASSERT( NULL != psa ); if ( psa ) { for( nIdx = LBOUND; nIdx < ( LBOUND + nItems ) ; nIdx++ ) { VARIANT var; CString strTemp;
strTemp = strText; strText += _tcslen( strText ) + 1;
CreateBlobArray( strTemp, var ); hResult = SafeArrayPutElement( psa, (long FAR *)&nIdx, &var ); VariantClear( &var ); }
V_VT( &rBlob ) = VT_VARIANT | VT_ARRAY; V_ARRAY( &rBlob ) = psa; } else { hResult = E_OUTOFMEMORY ; }
delete [] strStore;
return hResult; }
/******************************************************************************
Function: Convert Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ void Convert( CHAR* pszDest, WCHAR* pszwSrc ) { int nRes = 0;
if( wcslen( pszwSrc ) ) { nRes = WideCharToMultiByte( CP_ACP, WC_COMPOSITECHECK, pszwSrc, wcslen( pszwSrc ), pszDest, wcslen( pszwSrc ) + 1, NULL, NULL ); ASSERT( nRes ); }
pszDest[ nRes ] = '\0';
}
/******************************************************************************
Function: Convert Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ void Convert ( WCHAR* pszwDest, CHAR* pszSrc ) { BSTR bstrTemp;
bstrTemp = AllocBSTR( pszSrc ); wcscpy( pszwDest, bstrTemp ); SysFreeString( bstrTemp ); }
/******************************************************************************
Function: Convert Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ void Convert ( WCHAR* pszwDest, WCHAR* pszwSrc ) { wcscpy( pszwDest, pszwSrc ); }
/******************************************************************************
Function: Convert Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ void Convert( CHAR* pszDest, CHAR* pszSrc ) { strcpy( pszDest, pszSrc ); }
/******************************************************************************
Function: StringToLARGE_INTEGER Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ HRESULT StringToLARGE_INTEGER( TCHAR* szString, LARGE_INTEGER* pValue ) { if ( 0 == _stscanf( szString, _T("%I64d"), pValue ) ) { pValue = NULL ; }
return S_OK;
HRESULT hResult; VARIANT vString, vR8; double dLowPart, dHighPart; ULONG ulLowPart, ulHighPart; WCHAR szValue[ 32 ];
VariantInit( &vString ); VariantInit( &vR8 );
V_VT( &vString ) = VT_BSTR; Convert( szValue, szString ); V_BSTR( &vString ) = szValue;
hResult = VariantChangeType( &vR8, &vString, VARIANT_NOVALUEPROP, VT_R8 ); if( SUCCEEDED( hResult ) ) { dHighPart = V_R8( &vR8 ) / ((double) 1.0 + (double)(ULONG_MAX)); ulHighPart = (ULONG)dHighPart; dHighPart = (double)ulHighPart; dLowPart = V_R8( &vR8 ) - dHighPart*((double) 1.0 + (double)(ULONG_MAX)); ulLowPart = (ULONG)dLowPart;
pValue->HighPart= (LONG)ulHighPart; pValue->LowPart = ulHighPart; }
return hResult; }
/******************************************************************************
Function: StringToLARGE_INTEGER Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ HRESULT LARGE_INTEGERToString( TCHAR* szString, LARGE_INTEGER* pValue ) { if ( pValue ) { _stprintf( szString, _T("%I64d"), pValue->QuadPart ); } return S_OK;
/*TCHAR szText[ 32 ];
DWORD dwStatus; BOOL bOK = FALSE;
HMODULE hModule;
while( TRUE ) { hModule = LoadLibrary( _T("NTDLL.DLL" ) ); if( NULL == hModule ) break;
LargeIntegerToString = (LARGEINTTOSTRING)GetProcAddress( hModule, _T("RtlLargeIntegerToChar") ); if( NULL == LargeIntegerToString ) break;
dwStatus = LargeIntegerToString( pValue, 10, 31, szText ); if( 0 == dwStatus ) { Convert( szString, szText ); bOK = TRUE; }
break; }
if( NULL != hModule ) { FreeLibrary( hModule ); }
if( bOK ) { return S_OK; }
HRESULT hResult; double dVal; VARIANT vString, vR8;
dVal = (double)pValue->HighPart; dVal = dVal * ( (double) 1.0 + (double)(ULONG_MAX) );
dVal = dVal + (double)pValue->LowPart;
VariantInit( &vString ); VariantInit( &vR8 );
V_VT( &vR8 ) = VT_R8; V_R8( &vR8 ) = dVal;
hResult = VariantChangeType( &vString, &vR8, VARIANT_NOVALUEPROP, VT_BSTR ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) {
Convert( szString, V_BSTR( &vString ) ); VariantClear( &vString ); }
return hResult;*/ }
/******************************************************************************
Function: CopyACE Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ IDispatch* CopyACE( IDispatch* pSrc ) { IADsAccessControlEntry* pACE; IADsAccessControlEntry* pSrcACE; IDispatch* pNewACE = NULL; HRESULT hResult; LONG lValue; BSTR bstrValue = NULL;
hResult = pSrc->QueryInterface( IID_IADsAccessControlEntry, (void**)&pSrcACE );
if( FAILED( hResult ) ) return NULL;
hResult = CoCreateInstance( CLSID_AccessControlEntry, NULL, CLSCTX_INPROC_SERVER, IID_IADsAccessControlEntry, (void **)&pACE ); if( SUCCEEDED( hResult ) ) { //******************************************
hResult = pSrcACE->get_AccessMask( &lValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_AccessMask( lValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_AccessMask returns %lx\n"), hResult ); } }
//******************************************
hResult = pSrcACE->get_AceType( &lValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_AceType( lValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_AceType returns %lx\n"), hResult ); } }
//******************************************
hResult = pSrcACE->get_AceFlags( &lValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_AceFlags( lValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_AceFlags returns %lx\n"), hResult ); } }
//******************************************
hResult = pSrcACE->get_Flags( &lValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_Flags( lValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_Flags returns %lx\n"), hResult ); } }
//******************************************
hResult = pSrcACE->get_ObjectType( &bstrValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_ObjectType( bstrValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_ObjectType returns %lx\n"), hResult ); } SysFreeString( bstrValue ); bstrValue = NULL;
}
//******************************************
hResult = pSrcACE->get_InheritedObjectType( &bstrValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_InheritedObjectType( bstrValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_InheritedObjectType returns %lx\n"), hResult ); } SysFreeString( bstrValue ); bstrValue = NULL; }
//******************************************
hResult = pSrcACE->get_Trustee( &bstrValue ); ASSERT( SUCCEEDED( hResult ) );
if( SUCCEEDED( hResult ) ) { hResult = pACE->put_Trustee( bstrValue ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: put_Trustee returns %lx\n"), hResult ); } SysFreeString( bstrValue ); bstrValue = NULL; } hResult = pACE->QueryInterface( IID_IDispatch, (void**)&pNewACE ); pACE->Release( );
}
pSrcACE->Release( );
return pNewACE; }
/******************************************************************************
Function: CopyACL Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ IDispatch* CopyACL( IDispatch* pSrcACL ) { IADsAccessControlList* pACL = NULL; IADsAccessControlList* pADsNewACL = NULL; IDispatch* pNewACL = NULL; IUnknown* pEnum = NULL; IEnumVARIANT* pEnumVAR = NULL; HRESULT hResult; LONG lValue; ULONG lGet; VARIANT var;
hResult = pSrcACL->QueryInterface( IID_IADsAccessControlList, (void**)&pACL );
while( TRUE ) { if( FAILED( hResult ) ) break;
hResult = pACL->CopyAccessList( &pNewACL ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: CopyAccessList returns %lx\n"), hResult ); }
if( SUCCEEDED( hResult ) ) break;
hResult = CoCreateInstance( CLSID_AccessControlList, NULL, CLSCTX_INPROC_SERVER, IID_IADsAccessControlList, (void **)&pADsNewACL );
ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
hResult = pACL->get_AclRevision( &lValue ); if( SUCCEEDED( hResult ) ) { hResult = pADsNewACL->put_AclRevision( lValue ); ASSERT( SUCCEEDED( hResult ) ); }
hResult = pACL->get__NewEnum( &pEnum ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
hResult = pEnum->QueryInterface( IID_IEnumVARIANT, (void**)&pEnumVAR ); ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) break;
while( TRUE ) { lGet = 0; VariantInit( &var );
hResult = pEnumVAR->Next( 1, &var, &lGet ); if( 0 == lGet ) break;
hResult = pADsNewACL->AddAce( CopyACE( V_DISPATCH( &var ) ) ); VariantClear( &var ); }
hResult = pADsNewACL->QueryInterface( IID_IDispatch, (void**)& pNewACL ); break; }
if( NULL != pACL ) pACL->Release( );
if( NULL != pADsNewACL ) pADsNewACL->Release( );
if( NULL != pEnum ) pEnum->Release( );
if( NULL != pEnumVAR ) pEnumVAR->Release( );
return pNewACL; }
/******************************************************************************
Function: CopySD Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ IDispatch* CopySD( IDispatch* pSrcSD ) { IADsSecurityDescriptor* pSD; IDispatch* pNewSD = NULL; IADsSecurityDescriptor* pADsNewSD = NULL; HRESULT hResult; LONG lValue; BSTR bstrValue; IDispatch* pACL;
//hResult = pSrcSD->QueryInterface( IID_IDispatch, (void**)&pNewSD );
//return pNewSD;
hResult = pSrcSD->QueryInterface( IID_IADsSecurityDescriptor, (void**)&pSD );
while( TRUE ) { if( FAILED( hResult ) ) break;
hResult = pSD->CopySecurityDescriptor( &pNewSD ); if( FAILED( hResult ) ) { TRACE( _T("[ADSI] Error: CopySecurityDescriptor returns %lx\n"), hResult ); }
if( SUCCEEDED( hResult ) ) { pSD->Release( ); break; }
hResult = CoCreateInstance( CLSID_SecurityDescriptor, NULL, CLSCTX_INPROC_SERVER, IID_IADsSecurityDescriptor, (void **)&pADsNewSD );
ASSERT( SUCCEEDED( hResult ) );
if( FAILED( hResult ) ) break;
hResult = pSD->get_Revision( &lValue ); if( SUCCEEDED( hResult ) ) { hResult = pADsNewSD->put_Revision( lValue ); ASSERT( SUCCEEDED( hResult ) ); }
hResult = pSD->get_Control( &lValue ); if( SUCCEEDED( hResult ) ) { hResult = pADsNewSD->put_Control( lValue ); ASSERT( SUCCEEDED( hResult ) ); }
hResult = pSD->get_Owner( &bstrValue ); if( SUCCEEDED( hResult ) ) { hResult = pADsNewSD->put_Owner( bstrValue ); ASSERT( SUCCEEDED( hResult ) ); SysFreeString( bstrValue ); }
hResult = pSD->get_Group( &bstrValue ); if( SUCCEEDED( hResult ) ) { hResult = pADsNewSD->put_Group( bstrValue ); ASSERT( SUCCEEDED( hResult ) ); SysFreeString( bstrValue ); }
hResult = pSD->get_DiscretionaryAcl( &pACL ); if( SUCCEEDED( hResult ) && NULL != pACL ) { IDispatch* pCopy;
pCopy = CopyACL( pACL ); if( NULL != pCopy ) { hResult = pADsNewSD->put_DiscretionaryAcl( pCopy ); ASSERT( SUCCEEDED( hResult ) ); pCopy->Release( ); } pACL->Release( ); }
hResult = pSD->get_SystemAcl( &pACL ); if( SUCCEEDED( hResult ) && NULL != pACL ) { IDispatch* pCopy;
pCopy = CopyACL( pACL ); if( NULL != pCopy ) { hResult = pADsNewSD->put_SystemAcl( pCopy ); ASSERT( SUCCEEDED( hResult ) ); pCopy->Release( ); } pACL->Release( ); }
hResult = pADsNewSD->QueryInterface( IID_IDispatch, (void**)&pNewSD ); ASSERT( SUCCEEDED( hResult ) );
pADsNewSD->Release( );
break; }
return pNewSD; }
/******************************************************************************
Function: ConvertFromPropertyValue Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ BOOL ConvertFromPropertyValue( VARIANT& rVar, TCHAR* szText ) { IADsPropertyValue* pPropValue = NULL; HRESULT hResult; long lType; BSTR bstrVal = NULL;
if( VT_DISPATCH != V_VT(&rVar ) ) return FALSE;
hResult = V_DISPATCH( &rVar )->QueryInterface( IID_IADsPropertyValue, (void**)&pPropValue ); if( FAILED( hResult ) ) return FALSE;
while( TRUE ) { hResult = pPropValue->get_ADsType( &lType ); if( FAILED( hResult ) ) break;
switch( (ADSTYPEENUM)lType ) { case ADSTYPE_DN_STRING: { hResult = pPropValue->get_DNString( &bstrVal ); if( SUCCEEDED( hResult ) ) { Convert( szText, bstrVal ); SysFreeString( bstrVal ); } else { TRACE( _T("[ADSVW] Error: get_DNString returns %lx\n"), hResult ); } hResult = pPropValue->get_CaseExactString( &bstrVal ); if( SUCCEEDED( hResult ) ) { TRACE( _T("[ADSVW] Error: get_CaseExactString should fail\n") ); SysFreeString( bstrVal ); }
break; }
case ADSTYPE_CASE_EXACT_STRING: { hResult = pPropValue->get_CaseExactString( &bstrVal ); if( SUCCEEDED( hResult ) ) { Convert( szText, bstrVal ); SysFreeString( bstrVal ); } else { TRACE( _T("[ADSVW] Error: get_CaseExactString returns %lx\n"), hResult ); } hResult = pPropValue->get_DNString( &bstrVal ); if( SUCCEEDED( hResult ) ) { TRACE( _T("[ADSVW] Error: get_DNString should fail\n") ); SysFreeString( bstrVal ); }
break; }
case ADSTYPE_CASE_IGNORE_STRING: { hResult = pPropValue->get_CaseIgnoreString( &bstrVal ); if( SUCCEEDED( hResult ) ) { Convert( szText, bstrVal ); SysFreeString( bstrVal ); } else { TRACE( _T("[ADSVW] Error: get_CaseIgnoreString returns %lx\n"), hResult ); } hResult = pPropValue->get_DNString( &bstrVal ); if( SUCCEEDED( hResult ) ) { TRACE( _T("[ADSVW] Error: get_DNString should fail\n") ); SysFreeString( bstrVal ); }
break; }
case ADSTYPE_PRINTABLE_STRING: { hResult = pPropValue->get_PrintableString( &bstrVal ); if( SUCCEEDED( hResult ) ) { Convert( szText, bstrVal ); SysFreeString( bstrVal ); } else { TRACE( _T("[ADSVW] Error: get_PrintableString returns %lx\n"), hResult ); } hResult = pPropValue->get_DNString( &bstrVal ); if( SUCCEEDED( hResult ) ) { TRACE( _T("[ADSVW] Error: get_DNString should fail\n") ); SysFreeString( bstrVal ); }
break; }
case ADSTYPE_NUMERIC_STRING: { hResult = pPropValue->get_NumericString( &bstrVal ); if( SUCCEEDED( hResult ) ) { Convert( szText, bstrVal ); SysFreeString( bstrVal ); } else { TRACE( _T("[ADSVW] Error: get_NumericString returns %lx\n"), hResult ); } hResult = pPropValue->get_DNString( &bstrVal ); if( SUCCEEDED( hResult ) ) { TRACE( _T("[ADSVW] Error: get_DNString should fail\n") ); SysFreeString( bstrVal ); }
break; }
case ADSTYPE_BOOLEAN: { long lValue;
hResult = pPropValue->get_Boolean( &lValue ); if( SUCCEEDED( hResult ) ) { _ltot( lValue, szText, 10 ); } else { TRACE( _T("[ADSVW] Error: get_Boolean returns %lx\n"), hResult ); } hResult = pPropValue->get_Integer( &lValue ); if( SUCCEEDED( hResult ) ) { TRACE( _T("[ADSVW] Error: get_Integer should fail\n") ); }
break; }
default: ASSERT( FALSE ); break; }
break; }
pPropValue->Release( );
return TRUE; }
/******************************************************************************
Function: PurgeObject Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ HRESULT PurgeObject( IADsContainer* pParent, IUnknown* pIUnknown, LPWSTR pszPrefix ) { BSTR bstrName = NULL; BSTR bstrClass = NULL; VARIANT var; HRESULT hResult; IUnknown* pIChildUnk = NULL; IADs* pIChildOleDs = NULL; IADs* pADs; BSTR bstrObjName, bstrObjClass; IEnumVARIANT* pIEnumVar = NULL; IADsContainer* pIContainer = NULL; ULONG ulFetch = 0L; //BOOL bDelete;
if( NULL == pParent || NULL == pIUnknown ) return FALSE;
hResult = pIUnknown->QueryInterface( IID_IADs, (void**)&pADs ); if( FAILED( hResult ) ) return FALSE;
pADs->get_Name( &bstrObjName ); pADs->get_Class( &bstrObjClass ); pADs->Release( );
hResult = pIUnknown->QueryInterface( IID_IADsContainer, (void**)&pIContainer ); if( FAILED( hResult ) ) { if( NULL != pszPrefix && !_wcsnicmp( bstrObjName, pszPrefix, wcslen(pszPrefix) ) ) { hResult = pParent->Delete( bstrObjClass, bstrObjName ); TRACE( _T("Delete %S returns %lx\n"), bstrObjName, hResult ); } if( NULL == pszPrefix ) { hResult = pParent->Delete( bstrObjClass, bstrObjName ); TRACE( _T("Delete %S returns %lx\n"), bstrObjName, hResult ); }
SysFreeString( bstrObjClass ); SysFreeString( bstrObjName ); return S_OK; }
hResult = ADsBuildEnumerator( pIContainer, &pIEnumVar );
while( SUCCEEDED( hResult ) ) { ulFetch = 0L;
hResult = ADsEnumerateNext( pIEnumVar, 1, &var, &ulFetch ); if( FAILED( hResult ) ) continue;
if( !ulFetch ) break;
V_DISPATCH( &var )->QueryInterface( IID_IUnknown, (void**)&pIChildUnk );
VariantClear( &var );
if( NULL != pIChildUnk ) { PurgeObject( pIContainer, pIChildUnk, pszPrefix ); pIChildUnk->Release( ); } pIChildUnk = NULL; }
if( NULL != pIEnumVar ) { ADsFreeEnumerator( pIEnumVar ); } pIContainer->Release( );
hResult = pParent->Delete( bstrObjClass, bstrObjName );
TRACE( _T("\tDelete %S (%S) ends with %lx\n"), bstrObjName, bstrObjClass );
SysFreeString( bstrObjClass ); SysFreeString( bstrObjName );
return hResult; }
/******************************************************************************
Function: Bolb2String Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ CString Blob2String( void* pData, DWORD dwSize ) { DWORD dwIdx; TCHAR* pText; BYTE* pByte = (BYTE*)pData; CString strText;
pText = (TCHAR*)AllocADsMem( 1 + dwSize * 3 * sizeof( TCHAR ) ); memset( pText, 0, 1 + dwSize * 3 * sizeof( TCHAR ) );
for( dwIdx = 0; dwIdx < dwSize ; dwIdx++ ) { _stprintf( pText + _tcslen(pText), _T("%02x"), ((BYTE*)pData)[ dwIdx ] ); }
strText = pText; FreeADsMem( pText );
return strText; }
/******************************************************************************
Function: String2Blob Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ HRESULT String2Blob( TCHAR* pszText, void** ppData, DWORD* pdwLength ) { HRESULT hResult; CString strText; VARIANT vBlob; SAFEARRAY* pSafeArray; long lBound, uBound, lItem; BYTE* pbData;
strText = pszText; *pdwLength = 0;
hResult = CreateBlobArray( strText, vBlob ); if( FAILED( hResult ) ) { return hResult; }
pSafeArray = V_ARRAY( &vBlob );
hResult = SafeArrayGetLBound(pSafeArray, 1, &lBound); hResult = SafeArrayGetUBound(pSafeArray, 1, &uBound); *pdwLength = (uBound - lBound + 1);
pbData = (BYTE*) AllocADsMem( sizeof(BYTE) * (uBound - lBound + 1) );
for( lItem = lBound; lItem <= uBound ; lItem++ ) { hResult = SafeArrayGetElement( pSafeArray, &lItem, pbData + (lItem - lBound) ); if( FAILED( hResult ) ) { ASSERT( FALSE ); break; } }
*ppData = (void*)pbData;
return hResult; }
/******************************************************************************
Function: AllocTCHAR Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ TCHAR* AllocTCHAR ( CHAR* pszText ) { TCHAR* pszAlloc = NULL;
while( TRUE ) { ASSERT( NULL != pszText ); if( NULL == pszText ) break;
pszAlloc = (TCHAR*) AllocADsMem( sizeof(TCHAR)*(strlen(pszText) + 1) ); if( NULL == pszAlloc ) break;
Convert( pszAlloc, pszText ); break; }
return pszAlloc; }
/******************************************************************************
Function: AllocTCHAR Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ WCHAR* AllocWCHAR ( CHAR* pszText ) { WCHAR* pszAlloc = NULL;
while( TRUE ) { ASSERT( NULL != pszText ); if( NULL == pszText ) break;
pszAlloc = (WCHAR*) AllocADsMem( sizeof(WCHAR)*(strlen(pszText) + 1) ); if( NULL == pszAlloc ) break;
Convert( pszAlloc, pszText ); break; }
return pszAlloc; }
/******************************************************************************
Function: AllocTCHAR Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ TCHAR* AllocTCHAR( WCHAR* pszText ) { TCHAR* pszAlloc = NULL;
while( TRUE ) { ASSERT( NULL != pszText ); if( NULL == pszText ) break;
pszAlloc = (TCHAR*) AllocADsMem( sizeof(TCHAR)*(wcslen(pszText) + 1) ); if( NULL == pszAlloc ) break;
Convert( pszAlloc, pszText ); break; }
return pszAlloc; }
/******************************************************************************
Function: AllocTCHAR Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ WCHAR* AllocWCHAR( WCHAR* pszText ) { WCHAR* pszAlloc = NULL;
while( TRUE ) { ASSERT( NULL != pszText ); if( NULL == pszText ) break;
pszAlloc = (WCHAR*) AllocADsMem( sizeof(WCHAR)*(wcslen(pszText) + 1) ); if( NULL == pszAlloc ) break;
Convert( pszAlloc, pszText ); break; }
return pszAlloc; }
/*****************************************************************************
Function: GetVARIANTSize Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ long GetVARIANTSize( VARIANT &rVar ) { SAFEARRAY *psa = NULL; HRESULT hResult; long lLow, lUp;
ASSERT( VT_ARRAY & V_VT( &rVar ) );
if( !( VT_ARRAY & V_VT( &rVar ) ) ) return -1;
psa = V_ARRAY(&rVar);
if( NULL == psa ) return 0;
hResult = SafeArrayGetLBound( psa, 1, &lLow ); hResult = SafeArrayGetUBound( psa, 1, &lUp );
return (lUp - lLow + 1); }
/*****************************************************************************
Function: GetVARIANTAt Arguments: Return: Purpose: Author(s): Revision: Date: ******************************************************************************/ HRESULT GetVARIANTAt( long lIdx, VARIANT& vArray, VARIANT &vItem ) { SAFEARRAY *psa = NULL; HRESULT hResult; long lLow, lUp, lPos;
if( !( VT_ARRAY & V_VT( &vArray ) ) ) return E_FAIL;
psa = V_ARRAY(&vArray);
if( NULL == psa ) return E_FAIL;
VariantInit( &vItem );
hResult = SafeArrayGetLBound( psa, 1, &lLow ); hResult = SafeArrayGetUBound( psa, 1, &lUp );
lPos = lLow + lIdx; hResult = SafeArrayGetElement( psa, &lPos, &vItem );
return hResult; }
/******************************************************************************
Function: GetValuesCount Arguments: szText - ptr to TCHAR string to be "tokanized" cSep - Token separator Return: number of tokens in szText (cSep being the token separator) Purpose: The method id used to parse strings. The most common usage is for a string containing multiple values. Author(s): cezaru Revision: 1 Date: 08/10/97 ******************************************************************************/ long GetValuesCount( CString& szText, TCHAR cSep ) { int nIter; long lCount = 0;
for( nIter = 0; nIter < szText.GetLength( ) ; nIter++ ) { if( cSep == szText.GetAt( nIter ) ) lCount++; }
return ++lCount; }
/******************************************************************************
Function: GetElements Arguments: szText string to be parsed cSep token separator character lValues tokens count Return: an array of strings, each string being a token Purpose: breaks a string into multiple tokens Author(s): cezaru Revision: 1 Date: 08/10/97 ******************************************************************************/ CString GetValueAt( CString& szText, TCHAR cSep, long lValue ) { TCHAR* pszString; long lIter, lPos, lVal, lLength; TCHAR* pszTemp; CString strRes;
if( lValue >= GetValuesCount( szText, cSep ) ) return _T("");
lIter = 0; lPos = 0; lLength = sizeof(TCHAR) * ( 1 + szText.GetLength( ) ); pszTemp = (TCHAR*) AllocADsMem( lLength );
pszString = (TCHAR*) AllocADsMem( lLength );
while( lIter < lValue ) { if( szText.GetAt( lPos++ ) == cSep ) lIter++; }
lVal = 0;
while( lPos < szText.GetLength( ) && szText.GetAt( lPos ) != cSep ) { pszTemp[ lVal++ ] = szText.GetAt( lPos ); pszTemp[ lVal ] = _T('\0'); lPos++; }
strRes = pszTemp;
FreeADsMem( pszTemp );
return strRes; }
/******************************************************************************
Function: CreateLargeInteger Arguments: Return: Purpose: Author(s): cezaru Revision: 1 Date: 08/10/97 ******************************************************************************/ IDispatch* CreateLargeInteger( CString& strText ) { LARGE_INTEGER aLargeInteger; IADsLargeInteger* pLInt = NULL; IDispatch* pDisp = NULL; HRESULT hResult;
while( TRUE ) { hResult = StringToLARGE_INTEGER( strText.GetBuffer( 128 ), &aLargeInteger );
hResult = CoCreateInstance( CLSID_LargeInteger, NULL, CLSCTX_INPROC_SERVER, IID_IADsLargeInteger, (void **)&pLInt );
ASSERT( SUCCEEDED( hResult ) ); if( FAILED( hResult ) ) { TRACE( "\tERROR: CoCreateInstance(CLSID_LargeInteger,...) fails with %lx\n", hResult ); break; }
pLInt->put_HighPart( (LONG)aLargeInteger.HighPart ); pLInt->put_LowPart( (LONG)aLargeInteger.LowPart );
hResult = pLInt->QueryInterface( IID_IDispatch, (void**)&pDisp );
pLInt->Release( ); break; }
return pDisp; }
/******************************************************************************
Function: FromLargeInteger Arguments: Return: Purpose: Author(s): cezaru Revision: 1 Date: 08/10/97 ******************************************************************************/ CString FromLargeInteger( IDispatch* pDisp ) { LARGE_INTEGER aLargeInteger; IADsLargeInteger* pLInt = NULL; HRESULT hResult; TCHAR szText[ 128 ];
_tcscpy( szText, _T("") );
while( TRUE ) { hResult = pDisp->QueryInterface( IID_IADsLargeInteger, (void**)&pLInt ); if( FAILED( hResult ) ) break;
hResult = pLInt->get_HighPart( &aLargeInteger.HighPart ); hResult = pLInt->get_LowPart( (long*) &aLargeInteger.LowPart ); pLInt->Release( );
hResult = LARGE_INTEGERToString( szText, &aLargeInteger ); break; }
return szText; }
|