I use the IVdsService interface to get the IVdsSwProvider, but thought QueryPacks to get the pack show that the pack is offline, and QueryDisk / QueryVolumes FAILED.
the Error line is in the
block
//*************************
// Error info
//*************************
HRESULT hResult;
IVdsService* pService = NULL;
IVdsServiceLoader *pLoader = NULL;
hResult = CoInitializeEx(NULL, COINIT_MULTITHREADED);
CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
EOAC_NONE,
NULL
);
BOOL tx = SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE );
if( SUCCEEDED(hResult) )
{
hResult = CoCreateInstance(
CLSID_VdsLoader,
NULL,
CLSCTX_LOCAL_SERVER,
IID_IVdsServiceLoader,
(void**) &pLoader
);
if( SUCCEEDED(hResult) )
pLoader->LoadService(NULL, &pService);
_SafeRelease(pLoader);
if( SUCCEEDED(hResult) )
{
hResult = pService->WaitForServiceReady();
if ( SUCCEEDED(hResult) )
{
IEnumVdsObject* pEnumVdsObject = NULL;
hResult = pService->QueryProviders(VDS_QUERY_SOFTWARE_PROVIDERS,
&pEnumVdsObject);
hResult = pEnumVdsObject->Reset(); IUnknown* ppObjUnk ;
IVdsSwProvider* pVdsSwProvider = NULL;
IVdsPack* pVdsPack = NULL;
IVdsVolume* pVdsVolume = NULL;
ULONG ulFetched = 0;
hResult = E_INVALIDARG;
while(!SUCCEEDED(hResult))
{
hResult = pEnumVdsObject->Next(1, &ppObjUnk, &ulFetched);
hResult = ppObjUnk->QueryInterface(IID_IVdsSwProvider ,
(void**)&pVdsSwProvider);
if(!SUCCEEDED(hResult))
_SafeRelease(ppObjUnk);
}
_SafeRelease(pEnumVdsObject);
_SafeRelease(ppObjUnk);
hResult = pVdsSwProvider->QueryPacks(&pEnumVdsObject);
hResult = pEnumVdsObject->Reset();
hResult = E_INVALIDARG;
while(!SUCCEEDED(hResult))
{
hResult = pEnumVdsObject->Next(1, &ppObjUnk, &ulFetched);
hResult = ppObjUnk->QueryInterface(IID_IVdsPack, (void**)&pVdsPack);
if(!SUCCEEDED(hResult))
_SafeRelease(ppObjUnk);
}
_SafeRelease(pEnumVdsObject);
_SafeRelease(ppObjUnk);
VDS_PACK_PROP pPackProp;
pVdsPack->GetProperties(&pPackProp);
pPackProp show the Pack is Offline
hResult = pVdsPack->QueryDisks(&pEnumVdsObject);
hResult = pEnumVdsObject->Reset();
hResult = E_INVALIDARG;
ulFetched = 0;
BOOL bDone = FALSE;
while(!SUCCEEDED(hResult))
{
hResult = pEnumVdsObject->Next(1, &ppObjUnk, &ulFetched);
hResult is S_FALSE
if(!SUCCEEDED(hResult))
_SafeRelease(ppObjUnk);
}
_SafeRelease(pEnumVdsObject);
_SafeRelease(ppObjUnk);
_SafeRelease(pVdsPack);
_SafeRelease(pVdsSwProvider);
}
#define _SafeRelease(x) {if (NULL != x) { x->Release(); x = NULL; } }
BOOL CtrlHandler( DWORD fdwCtrlType )
{
switch( fdwCtrlType )
{
case CTRL_C_EVENT:
printf( "Ctrl-C event\n\n" );
Beep( 750, 300 );
return( TRUE );
case CTRL_CLOSE_EVENT:
Beep( 600, 200 );
printf( "Ctrl-Close event\n\n" );
return( TRUE );
case CTRL_BREAK_EVENT:
Beep( 900, 200 );
printf( "Ctrl-Break event\n\n" );
return FALSE;
case CTRL_LOGOFF_EVENT:
Beep( 1000, 200 );
printf( "Ctrl-Logoff event\n\n" );
return FALSE;
case CTRL_SHUTDOWN_EVENT:
Beep( 750, 500 );
printf( "Ctrl-Shutdown event\n\n" );
return FALSE;
default:
return FALSE;
}
}