694 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			694 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								//------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// File: DllSetup.cpp
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Desc: DirectShow base classes.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Copyright (c) 1992-2001 Microsoft Corporation.  All rights reserved.
							 | 
						||
| 
								 | 
							
								//------------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <streams.h>
							 | 
						||
| 
								 | 
							
								#include <strsafe.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// defines
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define MAX_KEY_LEN  260
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								// externally defined functions/variable
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								extern int g_cTemplates;
							 | 
						||
| 
								 | 
							
								extern CFactoryTemplate g_Templates[];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// EliminateSubKey
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// Try to enumerate all keys under this one.
							 | 
						||
| 
								 | 
							
								// if we find anything, delete it completely.
							 | 
						||
| 
								 | 
							
								// Otherwise just delete it.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// note - this was pinched/duplicated from
							 | 
						||
| 
								 | 
							
								// Filgraph\Mapper.cpp - so should it be in
							 | 
						||
| 
								 | 
							
								// a lib somewhere?
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								EliminateSubKey( HKEY hkey, LPCTSTR strSubKey )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  HKEY hk;
							 | 
						||
| 
								 | 
							
								  if (0 == lstrlen(strSubKey) ) {
							 | 
						||
| 
								 | 
							
								      // defensive approach
							 | 
						||
| 
								 | 
							
								      return E_FAIL;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  LONG lreturn = RegOpenKeyEx( hkey
							 | 
						||
| 
								 | 
							
								                             , strSubKey
							 | 
						||
| 
								 | 
							
								                             , 0
							 | 
						||
| 
								 | 
							
								                             , MAXIMUM_ALLOWED
							 | 
						||
| 
								 | 
							
								                             , &hk );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  ASSERT(    lreturn == ERROR_SUCCESS
							 | 
						||
| 
								 | 
							
								          || lreturn == ERROR_FILE_NOT_FOUND
							 | 
						||
| 
								 | 
							
								          || lreturn == ERROR_INVALID_HANDLE );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if( ERROR_SUCCESS == lreturn )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    // Keep on enumerating the first (zero-th)
							 | 
						||
| 
								 | 
							
								    // key and deleting that
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for( ; ; )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      TCHAR Buffer[MAX_KEY_LEN];
							 | 
						||
| 
								 | 
							
								      DWORD dw = MAX_KEY_LEN;
							 | 
						||
| 
								 | 
							
								      FILETIME ft;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      lreturn = RegEnumKeyEx( hk
							 | 
						||
| 
								 | 
							
								                            , 0
							 | 
						||
| 
								 | 
							
								                            , Buffer
							 | 
						||
| 
								 | 
							
								                            , &dw
							 | 
						||
| 
								 | 
							
								                            , NULL
							 | 
						||
| 
								 | 
							
								                            , NULL
							 | 
						||
| 
								 | 
							
								                            , NULL
							 | 
						||
| 
								 | 
							
								                            , &ft);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      ASSERT(    lreturn == ERROR_SUCCESS
							 | 
						||
| 
								 | 
							
								              || lreturn == ERROR_NO_MORE_ITEMS );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if( ERROR_SUCCESS == lreturn )
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        EliminateSubKey(hk, Buffer);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    RegCloseKey(hk);
							 | 
						||
| 
								 | 
							
								    RegDeleteKey(hkey, strSubKey);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return NOERROR;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// AMovieSetupRegisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// registers specfied file "szFileName" as server for
							 | 
						||
| 
								 | 
							
								// CLSID "clsServer".  A description is also required.
							 | 
						||
| 
								 | 
							
								// The ThreadingModel and ServerType are optional, as
							 | 
						||
| 
								 | 
							
								// they default to InprocServer32 (i.e. dll) and Both.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								AMovieSetupRegisterServer( CLSID   clsServer
							 | 
						||
| 
								 | 
							
								                         , LPCWSTR szDescription
							 | 
						||
| 
								 | 
							
								                         , LPCWSTR szFileName
							 | 
						||
| 
								 | 
							
								                         , LPCWSTR szThreadingModel = L"Both"
							 | 
						||
| 
								 | 
							
								                         , LPCWSTR szServerType     = L"InprocServer32" )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  // temp buffer
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  TCHAR achTemp[MAX_PATH];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // convert CLSID uuid to string and write
							 | 
						||
| 
								 | 
							
								  // out subkey as string - CLSID\{}
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  OLECHAR szCLSID[CHARS_IN_GUID];
							 | 
						||
| 
								 | 
							
								  HRESULT hr = StringFromGUID2( clsServer
							 | 
						||
| 
								 | 
							
								                              , szCLSID
							 | 
						||
| 
								 | 
							
								                              , CHARS_IN_GUID );
							 | 
						||
| 
								 | 
							
								  ASSERT( SUCCEEDED(hr) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // create key
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  HKEY hkey;
							 | 
						||
| 
								 | 
							
								  (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("CLSID\\%ls"), szCLSID );
							 | 
						||
| 
								 | 
							
								  LONG lreturn = RegCreateKey( HKEY_CLASSES_ROOT
							 | 
						||
| 
								 | 
							
								                             , (LPCTSTR)achTemp
							 | 
						||
| 
								 | 
							
								                             , &hkey              );
							 | 
						||
| 
								 | 
							
								  if( ERROR_SUCCESS != lreturn )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    return AmHresultFromWin32(lreturn);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // set description string
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szDescription );
							 | 
						||
| 
								 | 
							
								  lreturn = RegSetValue( hkey
							 | 
						||
| 
								 | 
							
								                       , (LPCTSTR)NULL
							 | 
						||
| 
								 | 
							
								                       , REG_SZ
							 | 
						||
| 
								 | 
							
								                       , achTemp
							 | 
						||
| 
								 | 
							
								                       , sizeof(achTemp) );
							 | 
						||
| 
								 | 
							
								  if( ERROR_SUCCESS != lreturn )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    RegCloseKey( hkey );
							 | 
						||
| 
								 | 
							
								    return AmHresultFromWin32(lreturn);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // create CLSID\\{"CLSID"}\\"ServerType" key,
							 | 
						||
| 
								 | 
							
								  // using key to CLSID\\{"CLSID"} passed back by
							 | 
						||
| 
								 | 
							
								  // last call to RegCreateKey().
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  HKEY hsubkey;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szServerType );
							 | 
						||
| 
								 | 
							
								  lreturn = RegCreateKey( hkey
							 | 
						||
| 
								 | 
							
								                        , achTemp
							 | 
						||
| 
								 | 
							
								                        , &hsubkey     );
							 | 
						||
| 
								 | 
							
								  if( ERROR_SUCCESS != lreturn )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    RegCloseKey( hkey );
							 | 
						||
| 
								 | 
							
								    return AmHresultFromWin32(lreturn);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // set Server string
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szFileName );
							 | 
						||
| 
								 | 
							
								  lreturn = RegSetValue( hsubkey
							 | 
						||
| 
								 | 
							
								                       , (LPCTSTR)NULL
							 | 
						||
| 
								 | 
							
								                       , REG_SZ
							 | 
						||
| 
								 | 
							
								                       , (LPCTSTR)achTemp
							 | 
						||
| 
								 | 
							
								                       , sizeof(TCHAR) * (lstrlen(achTemp)+1) );
							 | 
						||
| 
								 | 
							
								  if( ERROR_SUCCESS != lreturn )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    RegCloseKey( hkey );
							 | 
						||
| 
								 | 
							
								    RegCloseKey( hsubkey );
							 | 
						||
| 
								 | 
							
								    return AmHresultFromWin32(lreturn);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  (void)StringCchPrintf( achTemp, NUMELMS(achTemp), TEXT("%ls"), szThreadingModel );
							 | 
						||
| 
								 | 
							
								  lreturn = RegSetValueEx( hsubkey
							 | 
						||
| 
								 | 
							
								                         , TEXT("ThreadingModel")
							 | 
						||
| 
								 | 
							
								                         , 0L
							 | 
						||
| 
								 | 
							
								                         , REG_SZ
							 | 
						||
| 
								 | 
							
								                         , (CONST BYTE *)achTemp
							 | 
						||
| 
								 | 
							
								                         , sizeof(TCHAR) * (lstrlen(achTemp)+1) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // close hkeys
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  RegCloseKey( hkey );
							 | 
						||
| 
								 | 
							
								  RegCloseKey( hsubkey );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // and return
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  return HRESULT_FROM_WIN32(lreturn);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// AMovieSetupUnregisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// default ActiveMovie dll setup function
							 | 
						||
| 
								 | 
							
								// - to use must be called from an exported
							 | 
						||
| 
								 | 
							
								//   function named DllRegisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								AMovieSetupUnregisterServer( CLSID clsServer )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  // convert CLSID uuid to string and write
							 | 
						||
| 
								 | 
							
								  // out subkey CLSID\{}
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  OLECHAR szCLSID[CHARS_IN_GUID];
							 | 
						||
| 
								 | 
							
								  HRESULT hr = StringFromGUID2( clsServer
							 | 
						||
| 
								 | 
							
								                              , szCLSID
							 | 
						||
| 
								 | 
							
								                              , CHARS_IN_GUID );
							 | 
						||
| 
								 | 
							
								  ASSERT( SUCCEEDED(hr) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  TCHAR achBuffer[MAX_KEY_LEN];
							 | 
						||
| 
								 | 
							
								  (void)StringCchPrintf( achBuffer, NUMELMS(achBuffer), TEXT("CLSID\\%ls"), szCLSID );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // delete subkey
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  hr = EliminateSubKey( HKEY_CLASSES_ROOT, achBuffer );
							 | 
						||
| 
								 | 
							
								  ASSERT( SUCCEEDED(hr) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // return
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  return NOERROR;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// AMovieSetupRegisterFilter through IFilterMapper2
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								AMovieSetupRegisterFilter2( const AMOVIESETUP_FILTER * const psetupdata
							 | 
						||
| 
								 | 
							
								                          , IFilterMapper2 *                 pIFM2
							 | 
						||
| 
								 | 
							
								                          , BOOL                             bRegister  )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  DbgLog((LOG_TRACE, 3, TEXT("= AMovieSetupRegisterFilter")));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // check we've got data
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  if( NULL == psetupdata ) return S_FALSE;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // unregister filter
							 | 
						||
| 
								 | 
							
								  // (as pins are subkeys of filter's CLSID key
							 | 
						||
| 
								 | 
							
								  // they do not need to be removed separately).
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  DbgLog((LOG_TRACE, 3, TEXT("= = unregister filter")));
							 | 
						||
| 
								 | 
							
								  HRESULT hr = pIFM2->UnregisterFilter(
							 | 
						||
| 
								 | 
							
								      0,                        // default category
							 | 
						||
| 
								 | 
							
								      0,                        // default instance name
							 | 
						||
| 
								 | 
							
								      *psetupdata->clsID );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if( bRegister )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    REGFILTER2 rf2;
							 | 
						||
| 
								 | 
							
								    rf2.dwVersion = 1;
							 | 
						||
| 
								 | 
							
								    rf2.dwMerit = psetupdata->dwMerit;
							 | 
						||
| 
								 | 
							
								    rf2.cPins = psetupdata->nPins;
							 | 
						||
| 
								 | 
							
								    rf2.rgPins = psetupdata->lpPin;
							 | 
						||
| 
								 | 
							
								    
							 | 
						||
| 
								 | 
							
								    // register filter
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 3, TEXT("= = register filter")));
							 | 
						||
| 
								 | 
							
								    hr = pIFM2->RegisterFilter(*psetupdata->clsID
							 | 
						||
| 
								 | 
							
								                             , psetupdata->strName
							 | 
						||
| 
								 | 
							
								                             , 0 // moniker
							 | 
						||
| 
								 | 
							
								                             , 0 // category
							 | 
						||
| 
								 | 
							
								                             , NULL // instance
							 | 
						||
| 
								 | 
							
								                             , &rf2);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // handle one acceptable "error" - that
							 | 
						||
| 
								 | 
							
								  // of filter not being registered!
							 | 
						||
| 
								 | 
							
								  // (couldn't find a suitable #define'd
							 | 
						||
| 
								 | 
							
								  // name for the error!)
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  if( 0x80070002 == hr)
							 | 
						||
| 
								 | 
							
								    return NOERROR;
							 | 
						||
| 
								 | 
							
								  else
							 | 
						||
| 
								 | 
							
								    return hr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// RegisterAllServers()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								RegisterAllServers( LPCWSTR szFileName, BOOL bRegister )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  HRESULT hr = NOERROR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  for( int i = 0; i < g_cTemplates; i++ )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    // get i'th template
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    const CFactoryTemplate *pT = &g_Templates[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 2, TEXT("- - register %ls"),
							 | 
						||
| 
								 | 
							
								           (LPCWSTR)pT->m_Name ));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // register CLSID and InprocServer32
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( bRegister )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      hr = AMovieSetupRegisterServer( *(pT->m_ClsID)
							 | 
						||
| 
								 | 
							
								                                    , (LPCWSTR)pT->m_Name
							 | 
						||
| 
								 | 
							
								                                    , szFileName );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      hr = AMovieSetupUnregisterServer( *(pT->m_ClsID) );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // check final error for this pass
							 | 
						||
| 
								 | 
							
								    // and break loop if we failed
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( FAILED(hr) )
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return hr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// AMovieDllRegisterServer2()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// default ActiveMovie dll setup function
							 | 
						||
| 
								 | 
							
								// - to use must be called from an exported
							 | 
						||
| 
								 | 
							
								//   function named DllRegisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// this function is table driven using the
							 | 
						||
| 
								 | 
							
								// static members of the CFactoryTemplate
							 | 
						||
| 
								 | 
							
								// class defined in the dll.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// it registers the Dll as the InprocServer32
							 | 
						||
| 
								 | 
							
								// and then calls the IAMovieSetup.Register
							 | 
						||
| 
								 | 
							
								// method.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								AMovieDllRegisterServer2( BOOL bRegister )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  HRESULT hr = NOERROR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  DbgLog((LOG_TRACE, 2, TEXT("AMovieDllRegisterServer2()")));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // get file name (where g_hInst is the
							 | 
						||
| 
								 | 
							
								  // instance handle of the filter dll)
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  WCHAR achFileName[MAX_PATH];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // WIN95 doesn't support GetModuleFileNameW
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    char achTemp[MAX_PATH];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 2, TEXT("- get module file name")));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // g_hInst handle is set in our dll entry point. Make sure
							 | 
						||
| 
								 | 
							
								    // DllEntryPoint in dllentry.cpp is called
							 | 
						||
| 
								 | 
							
								    ASSERT(g_hInst != 0);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if( 0 == GetModuleFileNameA( g_hInst
							 | 
						||
| 
								 | 
							
								                              , achTemp
							 | 
						||
| 
								 | 
							
								                              , sizeof(achTemp) ) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      // we've failed!
							 | 
						||
| 
								 | 
							
								      DWORD dwerr = GetLastError();
							 | 
						||
| 
								 | 
							
								      return AmHresultFromWin32(dwerr);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    MultiByteToWideChar( CP_ACP
							 | 
						||
| 
								 | 
							
								                       , 0L
							 | 
						||
| 
								 | 
							
								                       , achTemp
							 | 
						||
| 
								 | 
							
								                       , lstrlenA(achTemp) + 1
							 | 
						||
| 
								 | 
							
								                       , achFileName
							 | 
						||
| 
								 | 
							
								                       , NUMELMS(achFileName) );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  // first registering, register all OLE servers
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  if( bRegister )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 2, TEXT("- register OLE Servers")));
							 | 
						||
| 
								 | 
							
								    hr = RegisterAllServers( achFileName, TRUE );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  // next, register/unregister all filters
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if( SUCCEEDED(hr) )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    // init is ref counted so call just in case
							 | 
						||
| 
								 | 
							
								    // we're being called cold.
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 2, TEXT("- CoInitialize")));
							 | 
						||
| 
								 | 
							
								    hr = CoInitialize( (LPVOID)NULL );
							 | 
						||
| 
								 | 
							
								    ASSERT( SUCCEEDED(hr) );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // get hold of IFilterMapper2
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 2, TEXT("- obtain IFilterMapper2")));
							 | 
						||
| 
								 | 
							
								    IFilterMapper2 *pIFM2 = 0;
							 | 
						||
| 
								 | 
							
								    IFilterMapper *pIFM = 0;
							 | 
						||
| 
								 | 
							
								    hr = CoCreateInstance( CLSID_FilterMapper2
							 | 
						||
| 
								 | 
							
								                         , NULL
							 | 
						||
| 
								 | 
							
								                         , CLSCTX_INPROC_SERVER
							 | 
						||
| 
								 | 
							
								                         , IID_IFilterMapper2
							 | 
						||
| 
								 | 
							
								                         , (void **)&pIFM2       );
							 | 
						||
| 
								 | 
							
								    if(FAILED(hr))
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        DbgLog((LOG_TRACE, 2, TEXT("- trying IFilterMapper instead")));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        hr = CoCreateInstance(
							 | 
						||
| 
								 | 
							
								            CLSID_FilterMapper,
							 | 
						||
| 
								 | 
							
								            NULL,
							 | 
						||
| 
								 | 
							
								            CLSCTX_INPROC_SERVER,
							 | 
						||
| 
								 | 
							
								            IID_IFilterMapper,
							 | 
						||
| 
								 | 
							
								            (void **)&pIFM);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if( SUCCEEDED(hr) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      // scan through array of CFactoryTemplates
							 | 
						||
| 
								 | 
							
								      // registering servers and filters.
							 | 
						||
| 
								 | 
							
								      //
							 | 
						||
| 
								 | 
							
								      DbgLog((LOG_TRACE, 2, TEXT("- register Filters")));
							 | 
						||
| 
								 | 
							
								      for( int i = 0; i < g_cTemplates; i++ )
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        // get i'th template
							 | 
						||
| 
								 | 
							
								        //
							 | 
						||
| 
								 | 
							
								        const CFactoryTemplate *pT = &g_Templates[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if( NULL != pT->m_pAMovieSetup_Filter )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								          DbgLog((LOG_TRACE, 2, TEXT("- - register %ls"), (LPCWSTR)pT->m_Name ));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if(pIFM2)
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								              hr = AMovieSetupRegisterFilter2( pT->m_pAMovieSetup_Filter, pIFM2, bRegister );
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          else
							 | 
						||
| 
								 | 
							
								          {
							 | 
						||
| 
								 | 
							
								              hr = AMovieSetupRegisterFilter( pT->m_pAMovieSetup_Filter, pIFM, bRegister );
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // check final error for this pass
							 | 
						||
| 
								 | 
							
								        // and break loop if we failed
							 | 
						||
| 
								 | 
							
								        //
							 | 
						||
| 
								 | 
							
								        if( FAILED(hr) )
							 | 
						||
| 
								 | 
							
								          break;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      // release interface
							 | 
						||
| 
								 | 
							
								      //
							 | 
						||
| 
								 | 
							
								      if(pIFM2)
							 | 
						||
| 
								 | 
							
								          pIFM2->Release();
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								          pIFM->Release();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // and clear up
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    CoFreeUnusedLibraries();
							 | 
						||
| 
								 | 
							
								    CoUninitialize();
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  // if unregistering, unregister all OLE servers
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  if( SUCCEEDED(hr) && !bRegister )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    DbgLog((LOG_TRACE, 2, TEXT("- register OLE Servers")));
							 | 
						||
| 
								 | 
							
								    hr = RegisterAllServers( achFileName, FALSE );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  DbgLog((LOG_TRACE, 2, TEXT("- return %0x"), hr));
							 | 
						||
| 
								 | 
							
								  return hr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// AMovieDllRegisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// default ActiveMovie dll setup function
							 | 
						||
| 
								 | 
							
								// - to use must be called from an exported
							 | 
						||
| 
								 | 
							
								//   function named DllRegisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// this function is table driven using the
							 | 
						||
| 
								 | 
							
								// static members of the CFactoryTemplate
							 | 
						||
| 
								 | 
							
								// class defined in the dll.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// it registers the Dll as the InprocServer32
							 | 
						||
| 
								 | 
							
								// and then calls the IAMovieSetup.Register
							 | 
						||
| 
								 | 
							
								// method.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								AMovieDllRegisterServer( void )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  HRESULT hr = NOERROR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // get file name (where g_hInst is the
							 | 
						||
| 
								 | 
							
								  // instance handle of the filter dll)
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  WCHAR achFileName[MAX_PATH];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    // WIN95 doesn't support GetModuleFileNameW
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    char achTemp[MAX_PATH];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if( 0 == GetModuleFileNameA( g_hInst
							 | 
						||
| 
								 | 
							
								                              , achTemp
							 | 
						||
| 
								 | 
							
								                              , sizeof(achTemp) ) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      // we've failed!
							 | 
						||
| 
								 | 
							
								      DWORD dwerr = GetLastError();
							 | 
						||
| 
								 | 
							
								      return AmHresultFromWin32(dwerr);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    MultiByteToWideChar( CP_ACP
							 | 
						||
| 
								 | 
							
								                       , 0L
							 | 
						||
| 
								 | 
							
								                       , achTemp
							 | 
						||
| 
								 | 
							
								                       , lstrlenA(achTemp) + 1
							 | 
						||
| 
								 | 
							
								                       , achFileName
							 | 
						||
| 
								 | 
							
								                       , NUMELMS(achFileName) );
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // scan through array of CFactoryTemplates
							 | 
						||
| 
								 | 
							
								  // registering servers and filters.
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  for( int i = 0; i < g_cTemplates; i++ )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    // get i'th template
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    const CFactoryTemplate *pT = &g_Templates[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // register CLSID and InprocServer32
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    hr = AMovieSetupRegisterServer( *(pT->m_ClsID)
							 | 
						||
| 
								 | 
							
								                                  , (LPCWSTR)pT->m_Name
							 | 
						||
| 
								 | 
							
								                                  , achFileName );
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // instantiate all servers and get hold of
							 | 
						||
| 
								 | 
							
								    // IAMovieSetup, if implemented, and call
							 | 
						||
| 
								 | 
							
								    // IAMovieSetup.Register() method
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( SUCCEEDED(hr) && (NULL != pT->m_lpfnNew) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      // instantiate object
							 | 
						||
| 
								 | 
							
								      //
							 | 
						||
| 
								 | 
							
								      PAMOVIESETUP psetup;
							 | 
						||
| 
								 | 
							
								      hr = CoCreateInstance( *(pT->m_ClsID)
							 | 
						||
| 
								 | 
							
								                           , 0
							 | 
						||
| 
								 | 
							
								                           , CLSCTX_INPROC_SERVER
							 | 
						||
| 
								 | 
							
								                           , IID_IAMovieSetup
							 | 
						||
| 
								 | 
							
								                           , reinterpret_cast<void**>(&psetup) );
							 | 
						||
| 
								 | 
							
								      if( SUCCEEDED(hr) )
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        hr = psetup->Unregister();
							 | 
						||
| 
								 | 
							
								        if( SUCCEEDED(hr) )
							 | 
						||
| 
								 | 
							
								          hr = psetup->Register();
							 | 
						||
| 
								 | 
							
								        psetup->Release();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        if(    (E_NOINTERFACE      == hr )
							 | 
						||
| 
								 | 
							
								            || (VFW_E_NEED_OWNER == hr ) )
							 | 
						||
| 
								 | 
							
								          hr = NOERROR;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // check final error for this pass
							 | 
						||
| 
								 | 
							
								    // and break loop if we failed
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( FAILED(hr) )
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  } // end-for
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return hr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// AMovieDllUnregisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// default ActiveMovie dll uninstall function
							 | 
						||
| 
								 | 
							
								// - to use must be called from an exported
							 | 
						||
| 
								 | 
							
								//   function named DllRegisterServer()
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// this function is table driven using the
							 | 
						||
| 
								 | 
							
								// static members of the CFactoryTemplate
							 | 
						||
| 
								 | 
							
								// class defined in the dll.
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// it calls the IAMovieSetup.Unregister
							 | 
						||
| 
								 | 
							
								// method and then unregisters the Dll
							 | 
						||
| 
								 | 
							
								// as the InprocServer32
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								//---------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								STDAPI
							 | 
						||
| 
								 | 
							
								AMovieDllUnregisterServer()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  // initialize return code
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  HRESULT hr = NOERROR;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // scan through CFactory template and unregister
							 | 
						||
| 
								 | 
							
								  // all OLE servers and filters.
							 | 
						||
| 
								 | 
							
								  //
							 | 
						||
| 
								 | 
							
								  for( int i = g_cTemplates; i--; )
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    // get i'th template
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    const CFactoryTemplate *pT = &g_Templates[i];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // check method exists
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( NULL != pT->m_lpfnNew )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      // instantiate object
							 | 
						||
| 
								 | 
							
								      //
							 | 
						||
| 
								 | 
							
								      PAMOVIESETUP psetup;
							 | 
						||
| 
								 | 
							
								      hr = CoCreateInstance( *(pT->m_ClsID)
							 | 
						||
| 
								 | 
							
								                           , 0
							 | 
						||
| 
								 | 
							
								                           , CLSCTX_INPROC_SERVER
							 | 
						||
| 
								 | 
							
								                           , IID_IAMovieSetup
							 | 
						||
| 
								 | 
							
								                           , reinterpret_cast<void**>(&psetup) );
							 | 
						||
| 
								 | 
							
								      if( SUCCEEDED(hr) )
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        hr = psetup->Unregister();
							 | 
						||
| 
								 | 
							
								        psetup->Release();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      else
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        if(    (E_NOINTERFACE      == hr )
							 | 
						||
| 
								 | 
							
								            || (VFW_E_NEED_OWNER == hr ) )
							 | 
						||
| 
								 | 
							
								           hr = NOERROR;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // unregister CLSID and InprocServer32
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( SUCCEEDED(hr) )
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								      hr = AMovieSetupUnregisterServer( *(pT->m_ClsID) );
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // check final error for this pass
							 | 
						||
| 
								 | 
							
								    // and break loop if we failed
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    if( FAILED(hr) )
							 | 
						||
| 
								 | 
							
								      break;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return hr;
							 | 
						||
| 
								 | 
							
								}
							 |