windows-nt/Source/XPSP1/NT/net/mmc/remrras/server/ncnetcfg.cpp
2020-09-26 16:20:57 +08:00

112 lines
3.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: N C N E T C F G . C P P
//
// Contents: Common routines for dealing with INetCfg interfaces.
//
// Notes:
//
// Author: shaunco 24 Mar 1997
//
//----------------------------------------------------------------------------
#include <stdafx.h>
#pragma hdrstop
#include "netcfgx.h"
#include "assert.h"
//nclude "netcfgn.h"
//nclude "ncdebug.h"
//nclude "ncbase.h"
//nclude "ncmisc.h"
#include "ncnetcfg.h"
//nclude "ncreg.h"
//nclude "ncvalid.h"
//+---------------------------------------------------------------------------
//
// Function: HrFindComponents
//
// Purpose: Find multiple INetCfgComponents with one call. This makes
// the error handling associated with multiple calls to
// QueryNetCfgClass and Find much easier.
//
// Arguments:
// pnc [in] pointer to INetCfg object
// cComponents [in] count of class guid pointers, component id
// pointers, and INetCfgComponent output pointers.
// apguidClass [in] array of class guid pointers.
// apszwComponentId [in] array of component id pointers.
// apncc [out] array of returned INetCfgComponet pointers.
//
// Returns: S_OK or an error code.
//
// Author: shaunco 22 Mar 1997
//
// Notes: cComponents is the count of pointers in all three arrays.
// S_OK will still be returned even if no components were
// found! This is by design.
//
HRESULT
HrFindComponents (
INetCfg* pnc,
ULONG cComponents,
const GUID** apguidClass,
const LPCWSTR* apszwComponentId,
INetCfgComponent** apncc)
{
Assert (pnc);
Assert (cComponents);
Assert (apguidClass);
Assert (apszwComponentId);
Assert (apncc);
// Initialize the output parameters.
//
ZeroMemory (apncc, cComponents * sizeof(*apncc));
// Find all of the components requested.
// Variable initialization is important here.
HRESULT hr = S_OK;
ULONG i;
for (i = 0; (i < cComponents) && SUCCEEDED(hr); i++)
{
// Get the class object for this component.
INetCfgClass* pncclass = NULL;
hr = pnc->QueryNetCfgClass (apguidClass[i], IID_INetCfgClass,
reinterpret_cast<void**>(&pncclass));
if (SUCCEEDED(hr) && pncclass)
{
// Find the component.
hr = pncclass->FindComponent (apszwComponentId[i], &apncc[i]);
AssertSz (SUCCEEDED(hr), "pncclass->Find failed.");
ReleaseObj (pncclass);
pncclass = NULL;
}
}
// On any error, release what we found and set the output to NULL.
if (FAILED(hr))
{
for (i = 0; i < cComponents; i++)
{
ReleaseObj (apncc[i]);
apncc[i] = NULL;
}
}
// Otherwise, normalize the HRESULT. (i.e. don't return S_FALSE)
else
{
hr = S_OK;
}
TraceResult ("HrFindComponents", hr);
return hr;
}