windows-nt/Source/XPSP1/NT/base/remoteboot/admin/varconv.cpp
2020-09-26 16:20:57 +08:00

179 lines
3 KiB
C++

//
// Copyright 1997 - Microsoft
//
//
// VARCONV.CPP - Handlers for converting from/to VARIANTs.
//
#include "pch.h"
#include "varconv.h"
DEFINE_MODULE("IMADMUI")
//
// StringArrayToVariant( )
//
// Creats an array of Vars that are BSTRs.
HRESULT
StringArrayToVariant(
VARIANT * pvData,
LPWSTR lpszData[], // array of LPWSTRs
DWORD dwCount ) // number of items in the array
{
TraceFunc( "StringArrayToVariant( ... )\n" );
HRESULT hr;
DWORD dw;
VARIANT * pvar;
SAFEARRAY * sa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = dwCount;
sa = SafeArrayCreate( VT_VARIANT, 1, rgsabound );
if ( !sa )
RRETURN(E_OUTOFMEMORY);
hr = THR( SafeArrayAccessData( sa, (void**) &pvar ) );
if (hr)
goto Error;
for ( dw = 0; dw < dwCount; dw++ )
{
hr = THR( PackStringToVariant( &pvar[dw], lpszData[dw] ) );
if (hr)
{
SafeArrayUnaccessData( sa );
goto Error;
}
}
SafeArrayUnaccessData( sa );
pvData->vt = VT_ARRAY | VT_VARIANT;
pvData->parray = sa;
Error:
HRETURN(hr);
}
//
// PackStringToVariant( )
//
HRESULT
PackStringToVariant(
VARIANT * pvData,
LPWSTR lpszData )
{
TraceFunc( "PackStringToVariant( )\n" );
BSTR bstrData = NULL;
if ( !lpszData || !pvData )
RRETURN(E_INVALIDARG);
bstrData = SysAllocString(lpszData);
if ( !bstrData )
RRETURN(E_OUTOFMEMORY);
pvData->vt = VT_BSTR;
pvData->bstrVal = bstrData;
HRETURN(S_OK);
}
//
// PackBytesToVariant( )
//
HRESULT
PackBytesToVariant(
VARIANT* pvData,
LPBYTE lpData,
DWORD cbBytes )
{
TraceFunc( "PackBytesToVariant( )\n" );
HRESULT hr = S_OK;
LPBYTE ptr;
SAFEARRAY* sa = NULL;
SAFEARRAYBOUND rgsabound[1];
if ( !lpData )
RRETURN(E_INVALIDARG);
if ( !pvData )
RRETURN(E_INVALIDARG);
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = cbBytes;
sa = SafeArrayCreate( VT_UI1, 1, rgsabound );
if ( !sa )
RRETURN(E_OUTOFMEMORY);
hr = THR( SafeArrayAccessData( sa, (LPVOID*)&ptr ) );
if (hr)
goto Error;
CopyMemory( ptr, lpData, cbBytes );
SafeArrayUnaccessData( sa );
pvData->vt = VT_UI1 | VT_ARRAY;
pvData->parray = sa;
Cleanup:
HRETURN(hr);
Error:
if ( sa )
SafeArrayDestroy( sa );
goto Cleanup;
}
//
// PackDWORDToVariant( )
//
HRESULT
PackDWORDToVariant(
VARIANT * pvData,
DWORD dwData )
{
TraceFunc( "PackDWORDToVariant( )\n" );
if ( !pvData )
RRETURN(E_INVALIDARG);
pvData->vt = VT_I4;
pvData->lVal = dwData;
HRETURN(S_OK);
}
//
// PackBOOLToVariant( )
//
HRESULT
PackBOOLToVariant(
VARIANT * pvData,
BOOL fData )
{
TraceFunc( "PackBOOLToVariant( )\n" );
if ( !pvData )
RETURN(E_INVALIDARG);
pvData->vt = VT_BOOL;
V_BOOL( pvData ) = (VARIANT_BOOL)fData;
RETURN(S_OK);
}