271 lines
5.4 KiB
C++
271 lines
5.4 KiB
C++
//---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1996
|
|
//
|
|
// File: proputil.cxx
|
|
//
|
|
// Contents: Property Listing Utilities
|
|
//
|
|
// History: 08-05-96 t-danal created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
//
|
|
// ********* System Includes
|
|
//
|
|
|
|
#define UNICODE
|
|
#define _UNICODE
|
|
#define INC_OLE2
|
|
// #define _OLEAUT32_
|
|
// #define SECURITY_WIN32
|
|
|
|
|
|
#include <windows.h>
|
|
|
|
//
|
|
// ********* CRunTime Includes
|
|
//
|
|
|
|
#include <stdlib.h>
|
|
#include <limits.h>
|
|
#include <io.h>
|
|
#include <stdio.h>
|
|
|
|
//
|
|
// ********* Public ADs includes
|
|
//
|
|
|
|
#include <activeds.h>
|
|
|
|
#include "macro.hxx"
|
|
#include "proputil.hxx"
|
|
|
|
HRESULT
|
|
PrintVariant(
|
|
VARIANT varPropData
|
|
)
|
|
{
|
|
HRESULT hr;
|
|
BSTR bstrValue;
|
|
|
|
switch (varPropData.vt) {
|
|
case VT_I4:
|
|
printf("\t%d", varPropData.lVal);
|
|
break;
|
|
case VT_BSTR:
|
|
printf("\t%S", varPropData.bstrVal);
|
|
break;
|
|
|
|
case VT_BOOL:
|
|
printf("\t%d", V_BOOL(&varPropData));
|
|
break;
|
|
|
|
case (VT_ARRAY | VT_VARIANT):
|
|
PrintVariantArray(varPropData);
|
|
break;
|
|
|
|
case VT_DATE:
|
|
hr = VarBstrFromDate(
|
|
varPropData.date,
|
|
LOCALE_SYSTEM_DEFAULT,
|
|
LOCALE_NOUSEROVERRIDE,
|
|
&bstrValue
|
|
);
|
|
printf("\t%S", bstrValue);
|
|
break;
|
|
|
|
default:
|
|
printf("\tData type is %d\n", varPropData.vt);
|
|
break;
|
|
|
|
}
|
|
printf("\n");
|
|
return(S_OK);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PrintVariantArray(
|
|
VARIANT var
|
|
)
|
|
{
|
|
LONG dwSLBound = 0;
|
|
LONG dwSUBound = 0;
|
|
VARIANT v;
|
|
LONG i;
|
|
HRESULT hr = S_OK;
|
|
|
|
if(!((V_VT(&var) & VT_VARIANT) && V_ISARRAY(&var))) {
|
|
return(E_FAIL);
|
|
}
|
|
|
|
//
|
|
// Check that there is only one dimension in this array
|
|
//
|
|
|
|
if ((V_ARRAY(&var))->cDims != 1) {
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
//
|
|
// Check that there is atleast one element in this array
|
|
//
|
|
|
|
if ((V_ARRAY(&var))->rgsabound[0].cElements == 0){
|
|
hr = E_FAIL;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
//
|
|
// We know that this is a valid single dimension array
|
|
//
|
|
|
|
hr = SafeArrayGetLBound(V_ARRAY(&var),
|
|
1,
|
|
(long FAR *)&dwSLBound
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = SafeArrayGetUBound(V_ARRAY(&var),
|
|
1,
|
|
(long FAR *)&dwSUBound
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
printf("\t");
|
|
for (i = dwSLBound; i <= dwSUBound; i++) {
|
|
VariantInit(&v);
|
|
hr = SafeArrayGetElement(V_ARRAY(&var),
|
|
(long FAR *)&i,
|
|
&v
|
|
);
|
|
if (FAILED(hr)) {
|
|
continue;
|
|
}
|
|
|
|
|
|
if (i < dwSUBound) {
|
|
printf("%S, ", v.bstrVal);
|
|
}else{
|
|
printf("%S",v.bstrVal);
|
|
}
|
|
}
|
|
return(S_OK);
|
|
|
|
error:
|
|
return(hr);
|
|
}
|
|
|
|
|
|
HRESULT
|
|
PrintProperty(
|
|
BSTR bstrPropName,
|
|
HRESULT hRetVal,
|
|
VARIANT varPropData
|
|
)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
switch (hRetVal) {
|
|
case 0:
|
|
printf("Property: %S", bstrPropName);
|
|
PrintVariant(varPropData);
|
|
break;
|
|
|
|
case E_ADS_CANT_CONVERT_DATATYPE:
|
|
printf("Property: %S", bstrPropName);
|
|
printf("\tProperty data could not be converted to variant\n");
|
|
break;
|
|
|
|
default:
|
|
printf("Property: %S", bstrPropName);
|
|
printf("\tProperty not available in cache\n");
|
|
break;
|
|
|
|
}
|
|
return(hr);
|
|
}
|
|
|
|
HRESULT
|
|
GetPropertyList(
|
|
IADs * pADs,
|
|
VARIANT ** ppVariant,
|
|
PDWORD pcElementFetched
|
|
)
|
|
{
|
|
HRESULT hr= S_OK;
|
|
BSTR bstrSchemaPath = NULL;
|
|
IADsContainer * pADsContainer = NULL;
|
|
IEnumVARIANT * pEnumVariant = NULL;
|
|
BOOL fContinue = TRUE;
|
|
ULONG cthisElement = 0L;
|
|
ULONG cElementFetched = 0L;
|
|
LPBYTE pVariantArray = NULL;
|
|
VARIANT varProperty;
|
|
DWORD cb = 0;
|
|
|
|
hr = pADs->get_Schema(&bstrSchemaPath);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = ADsGetObject(
|
|
bstrSchemaPath,
|
|
IID_IADsContainer,
|
|
(void **)&pADsContainer
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
hr = ADsBuildEnumerator(
|
|
pADsContainer,
|
|
&pEnumVariant
|
|
);
|
|
BAIL_ON_FAILURE(hr);
|
|
|
|
while (fContinue) {
|
|
|
|
VariantInit(&varProperty);
|
|
hr = ADsEnumerateNext(
|
|
pEnumVariant,
|
|
1,
|
|
&varProperty,
|
|
&cthisElement
|
|
);
|
|
|
|
if (hr == S_FALSE) {
|
|
fContinue = FALSE;
|
|
break;
|
|
}
|
|
|
|
pVariantArray = (LPBYTE)realloc(
|
|
(void *)pVariantArray,
|
|
cb + sizeof(VARIANT)
|
|
);
|
|
|
|
if (!pVariantArray) {
|
|
hr = E_OUTOFMEMORY;
|
|
BAIL_ON_FAILURE(hr);
|
|
}
|
|
|
|
memcpy(pVariantArray + cb, (LPBYTE)&varProperty, sizeof(VARIANT));
|
|
cb += sizeof(VARIANT);
|
|
|
|
cElementFetched += cthisElement;
|
|
|
|
}
|
|
|
|
*ppVariant = (LPVARIANT)pVariantArray;
|
|
*pcElementFetched = cElementFetched;
|
|
|
|
error:
|
|
if (bstrSchemaPath) {
|
|
SysFreeString(bstrSchemaPath);
|
|
}
|
|
|
|
if (pADsContainer) {
|
|
pADsContainer->Release();
|
|
}
|
|
|
|
return(hr);
|
|
}
|