551 lines
10 KiB
C++
551 lines
10 KiB
C++
|
//+-------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Windows
|
||
|
//
|
||
|
// Copyright (C) Microsoft Corporation, 1995 - 1999
|
||
|
//
|
||
|
// File: viewcol.cpp
|
||
|
//
|
||
|
// Contents: IEnumCERTVIEWCOLUMN IDispatch helper functions
|
||
|
//
|
||
|
//--------------------------------------------------------------------------
|
||
|
|
||
|
#include <pch.cpp>
|
||
|
|
||
|
#pragma hdrstop
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include "csdisp.h"
|
||
|
#include "csprop.h"
|
||
|
|
||
|
|
||
|
//+------------------------------------------------------------------------
|
||
|
// IEnumCERTVIEWCOLUMN dispatch support
|
||
|
|
||
|
//+------------------------------------
|
||
|
// OpenConnection method:
|
||
|
|
||
|
static OLECHAR *_apszNext[] = {
|
||
|
TEXT("Next"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetName method:
|
||
|
|
||
|
static OLECHAR *_apszGetName[] = {
|
||
|
TEXT("GetName"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetDisplayName method:
|
||
|
|
||
|
static OLECHAR *_apszGetDisplayName[] = {
|
||
|
TEXT("GetDisplayName"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetType method:
|
||
|
|
||
|
static OLECHAR *_apszGetType[] = {
|
||
|
TEXT("GetType"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// IsIndexed method:
|
||
|
|
||
|
static OLECHAR *_apszIsIndexed[] = {
|
||
|
TEXT("IsIndexed"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetMaxLength method:
|
||
|
|
||
|
static OLECHAR *_apszGetMaxLength[] = {
|
||
|
TEXT("GetMaxLength"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// GetValue method:
|
||
|
|
||
|
static OLECHAR *_apszGetValue[] = {
|
||
|
TEXT("GetValue"),
|
||
|
TEXT("Flags"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// Skip method:
|
||
|
|
||
|
static OLECHAR *_apszSkip[] = {
|
||
|
TEXT("Skip"),
|
||
|
TEXT("celt"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// Reset method:
|
||
|
|
||
|
static OLECHAR *_apszReset[] = {
|
||
|
TEXT("Reset"),
|
||
|
};
|
||
|
|
||
|
//+------------------------------------
|
||
|
// Clone method:
|
||
|
|
||
|
static OLECHAR *_apszClone[] = {
|
||
|
TEXT("Clone"),
|
||
|
};
|
||
|
|
||
|
|
||
|
//+------------------------------------
|
||
|
// Dispatch Table:
|
||
|
|
||
|
DISPATCHTABLE g_adtViewColumn[] =
|
||
|
{
|
||
|
#define VIEWCOL_NEXT 0
|
||
|
DECLARE_DISPATCH_ENTRY(_apszNext)
|
||
|
|
||
|
#define VIEWCOL_GETNAME 1
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetName)
|
||
|
|
||
|
#define VIEWCOL_GETDISPLAYNAME 2
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetDisplayName)
|
||
|
|
||
|
#define VIEWCOL_GETTYPE 3
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetType)
|
||
|
|
||
|
#define VIEWCOL_ISINDEXED 4
|
||
|
DECLARE_DISPATCH_ENTRY(_apszIsIndexed)
|
||
|
|
||
|
#define VIEWCOL_GETMAXLENGTH 5
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetMaxLength)
|
||
|
|
||
|
#define VIEWCOL_GETVALUE 6
|
||
|
DECLARE_DISPATCH_ENTRY(_apszGetValue)
|
||
|
|
||
|
#define VIEWCOL_SKIP 7
|
||
|
DECLARE_DISPATCH_ENTRY(_apszSkip)
|
||
|
|
||
|
#define VIEWCOL_RESET 8
|
||
|
DECLARE_DISPATCH_ENTRY(_apszReset)
|
||
|
|
||
|
#define VIEWCOL_CLONE 9
|
||
|
DECLARE_DISPATCH_ENTRY(_apszClone)
|
||
|
};
|
||
|
#define CVIEWCOLDISPATCH (ARRAYSIZE(g_adtViewColumn))
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_Init2(
|
||
|
IN BOOL fIDispatch,
|
||
|
IN IEnumCERTVIEWCOLUMN *pEnumColumn,
|
||
|
OUT DISPATCHINTERFACE *pdiViewColumn)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IDispatch *pDispatch = NULL;
|
||
|
static BOOL s_fInitialized = FALSE;
|
||
|
|
||
|
pdiViewColumn->pDispatchTable = NULL;
|
||
|
pdiViewColumn->pDispatch = NULL;
|
||
|
pdiViewColumn->pUnknown = NULL;
|
||
|
if (fIDispatch)
|
||
|
{
|
||
|
hr = pEnumColumn->QueryInterface(
|
||
|
IID_IDispatch,
|
||
|
(VOID **) &pDispatch);
|
||
|
_JumpIfError(hr, error, "QueryInterface");
|
||
|
|
||
|
hr = DispatchGetIds(
|
||
|
pDispatch,
|
||
|
CVIEWCOLDISPATCH,
|
||
|
g_adtViewColumn,
|
||
|
pdiViewColumn);
|
||
|
_JumpIfError(hr, error, "DispatchGetIds");
|
||
|
|
||
|
pdiViewColumn->pDispatch = pDispatch;
|
||
|
pDispatch = NULL;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pEnumColumn->AddRef();
|
||
|
pdiViewColumn->pUnknown = (IUnknown *) pEnumColumn;
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
pdiViewColumn->pDispatchTable = g_adtViewColumn;
|
||
|
|
||
|
error:
|
||
|
if (NULL != pDispatch)
|
||
|
{
|
||
|
pDispatch->Release();
|
||
|
}
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
ViewColumn_Release(
|
||
|
IN OUT DISPATCHINTERFACE *pdiViewColumn)
|
||
|
{
|
||
|
DispatchRelease(pdiViewColumn);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_Next(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT LONG *pIndex)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_NEXT,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_I4,
|
||
|
pIndex);
|
||
|
_JumpIfError2(hr, error, "Invoke(Next)", S_FALSE);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Next(pIndex);
|
||
|
_JumpIfError2(hr, error, "Next", S_FALSE);
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_GetName(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT BSTR *pstrOut)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_GETNAME,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_BSTR,
|
||
|
pstrOut);
|
||
|
_JumpIfError(hr, error, "Invoke(GetName)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetName(pstrOut);
|
||
|
_JumpIfError(hr, error, "GetName");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_GetDisplayName(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT BSTR *pstrOut)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_GETDISPLAYNAME,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_BSTR,
|
||
|
pstrOut);
|
||
|
_JumpIfError(hr, error, "Invoke(GetDisplayName)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetDisplayName(pstrOut);
|
||
|
_JumpIfError(hr, error, "GetDisplayName");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_GetType(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT LONG *pType)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_GETTYPE,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_I4,
|
||
|
pType);
|
||
|
_JumpIfError(hr, error, "Invoke(GetType)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetType(pType);
|
||
|
_JumpIfError(hr, error, "GetType");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_IsIndexed(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT LONG *pIndexed)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_ISINDEXED,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_I4,
|
||
|
pIndexed);
|
||
|
_JumpIfError(hr, error, "Invoke(IsIndexed)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->IsIndexed(pIndexed);
|
||
|
_JumpIfError(hr, error, "IsIndexed");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_GetMaxLength(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT LONG *pMaxLength)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_GETMAXLENGTH,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_I4,
|
||
|
pMaxLength);
|
||
|
_JumpIfError(hr, error, "Invoke(GetMaxLength)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetMaxLength(
|
||
|
pMaxLength);
|
||
|
_JumpIfError(hr, error, "GetMaxLength");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_GetValue(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
IN LONG Flags,
|
||
|
IN LONG ColumnType,
|
||
|
OUT VOID *pColumnValue)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
LONG RetType;
|
||
|
VARIANT varResult;
|
||
|
|
||
|
VariantInit(&varResult);
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
switch (ColumnType)
|
||
|
{
|
||
|
case PROPTYPE_BINARY:
|
||
|
case PROPTYPE_STRING:
|
||
|
RetType = VT_BSTR;
|
||
|
break;
|
||
|
|
||
|
case PROPTYPE_DATE:
|
||
|
RetType = VT_DATE;
|
||
|
break;
|
||
|
|
||
|
case PROPTYPE_LONG:
|
||
|
RetType = VT_I4;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
hr = E_INVALIDARG;
|
||
|
_JumpError(hr, error, "PropertyType");
|
||
|
}
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[1];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = Flags;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_GETVALUE,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
RetType,
|
||
|
pColumnValue);
|
||
|
_JumpIfError2(hr, error, "Invoke(GetValue)", CERTSRV_E_PROPERTY_EMPTY);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->GetValue(
|
||
|
Flags,
|
||
|
&varResult);
|
||
|
_JumpIfError(hr, error, "GetValue");
|
||
|
|
||
|
hr = DispatchGetReturnValue(&varResult, RetType, pColumnValue);
|
||
|
_JumpIfError2(hr, error, "DispatchGetReturnValue", CERTSRV_E_PROPERTY_EMPTY);
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
VariantClear(&varResult);
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_Skip(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
IN LONG celt)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
VARIANT avar[1];
|
||
|
|
||
|
avar[0].vt = VT_I4;
|
||
|
avar[0].lVal = celt;
|
||
|
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_SKIP,
|
||
|
ARRAYSIZE(avar),
|
||
|
avar,
|
||
|
0,
|
||
|
NULL);
|
||
|
_JumpIfError(hr, error, "Invoke(Skip)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Skip(celt);
|
||
|
_JumpIfError(hr, error, "Skip");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_Reset(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
IN LONG celt)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_RESET,
|
||
|
0,
|
||
|
NULL,
|
||
|
0,
|
||
|
NULL);
|
||
|
_JumpIfError(hr, error, "Invoke(Reset)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Reset();
|
||
|
_JumpIfError(hr, error, "Reset");
|
||
|
}
|
||
|
|
||
|
error:
|
||
|
return(hr);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT
|
||
|
ViewColumn_Clone(
|
||
|
IN DISPATCHINTERFACE *pdiViewColumn,
|
||
|
OUT DISPATCHINTERFACE *pdiViewColumnClone)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
IEnumCERTVIEWCOLUMN *pEnumColumn = NULL;
|
||
|
|
||
|
CSASSERT(NULL != pdiViewColumn && NULL != pdiViewColumn->pDispatchTable);
|
||
|
|
||
|
if (NULL != pdiViewColumn->pDispatch)
|
||
|
{
|
||
|
hr = DispatchInvoke(
|
||
|
pdiViewColumn,
|
||
|
VIEWCOL_CLONE,
|
||
|
0,
|
||
|
NULL,
|
||
|
VT_DISPATCH,
|
||
|
&pEnumColumn);
|
||
|
_JumpIfError(hr, error, "Invoke(Clone)");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = ((IEnumCERTVIEWCOLUMN *) pdiViewColumn->pUnknown)->Clone(
|
||
|
&pEnumColumn);
|
||
|
_JumpIfError(hr, error, "Clone");
|
||
|
}
|
||
|
hr = ViewColumn_Init2(
|
||
|
NULL != pdiViewColumn->pDispatch,
|
||
|
pEnumColumn,
|
||
|
pdiViewColumnClone);
|
||
|
_JumpIfError(hr, error, "ViewColumn_Init2");
|
||
|
|
||
|
error:
|
||
|
if (NULL != pEnumColumn)
|
||
|
{
|
||
|
pEnumColumn->Release();
|
||
|
}
|
||
|
return(hr);
|
||
|
}
|