00001
00002
00003
00004
00005
00006 #include <streams.h>
00007
00008 #define MAX_KEY_LEN 260
00009
00010 extern int g_cTemplates;
00011 extern CFactoryTemplate g_Templates[];
00012
00013 STDAPI
00014 EliminateSubKey( HKEY hkey, LPTSTR strSubKey )
00015 {
00016 HKEY hk;
00017 if (0 == lstrlen(strSubKey) ) {
00018
00019 return E_FAIL;
00020 }
00021
00022 LONG lreturn = RegOpenKeyEx( hkey
00023 , strSubKey
00024 , 0
00025 , MAXIMUM_ALLOWED
00026 , &hk );
00027
00028 ASSERT( lreturn == ERROR_SUCCESS
00029 || lreturn == ERROR_FILE_NOT_FOUND
00030 || lreturn == ERROR_INVALID_HANDLE );
00031
00032 if( ERROR_SUCCESS == lreturn )
00033 {
00034
00035 for( ; ; )
00036 {
00037 TCHAR Buffer[MAX_KEY_LEN];
00038 DWORD dw = MAX_KEY_LEN;
00039 FILETIME ft;
00040
00041 lreturn = RegEnumKeyEx( hk
00042 , 0
00043 , Buffer
00044 , &dw
00045 , NULL
00046 , NULL
00047 , NULL
00048 , &ft);
00049
00050 ASSERT( lreturn == ERROR_SUCCESS
00051 || lreturn == ERROR_NO_MORE_ITEMS );
00052
00053 if( ERROR_SUCCESS == lreturn )
00054 {
00055 EliminateSubKey(hk, Buffer);
00056 }
00057 else
00058 {
00059 break;
00060 }
00061 }
00062
00063 RegCloseKey(hk);
00064 RegDeleteKey(hkey, strSubKey);
00065 }
00066
00067 return NOERROR;
00068 }
00069
00070 STDAPI
00071 AMovieSetupRegisterServer( CLSID clsServer
00072 , LPCWSTR szDescription
00073 , LPCWSTR szFileName
00074 , LPCWSTR szThreadingModel = L"Both"
00075 , LPCWSTR szServerType = L"InprocServer32" )
00076 {
00077
00078
00079 TCHAR achTemp[MAX_PATH];
00080
00081 OLECHAR szCLSID[CHARS_IN_GUID];
00082 HRESULT hr = StringFromGUID2( clsServer
00083 , szCLSID
00084 , CHARS_IN_GUID );
00085 ASSERT( SUCCEEDED(hr) );
00086
00087 HKEY hkey;
00088 wsprintf( achTemp, TEXT("CLSID\\%ls"), szCLSID );
00089 LONG lreturn = RegCreateKey( HKEY_CLASSES_ROOT
00090 , (LPCTSTR)achTemp
00091 , &hkey );
00092 if( ERROR_SUCCESS != lreturn )
00093 {
00094 return AmHresultFromWin32(lreturn);
00095 }
00096
00097 wsprintf( achTemp, TEXT("%ls"), szDescription );
00098 lreturn = RegSetValue( hkey
00099 , (LPCTSTR)NULL
00100 , REG_SZ
00101 , achTemp
00102 , sizeof(achTemp) );
00103 if( ERROR_SUCCESS != lreturn )
00104 {
00105 RegCloseKey( hkey );
00106 return AmHresultFromWin32(lreturn);
00107 }
00108
00109 HKEY hsubkey;
00110
00111 wsprintf( achTemp, TEXT("%ls"), szServerType );
00112 lreturn = RegCreateKey( hkey
00113 , achTemp
00114 , &hsubkey );
00115 if( ERROR_SUCCESS != lreturn )
00116 {
00117 RegCloseKey( hkey );
00118 return AmHresultFromWin32(lreturn);
00119 }
00120
00121 wsprintf( achTemp, TEXT("%ls"), szFileName );
00122 lreturn = RegSetValue( hsubkey
00123 , (LPCTSTR)NULL
00124 , REG_SZ
00125 , (LPCTSTR)achTemp
00126 , sizeof(TCHAR) * (lstrlen(achTemp)+1) );
00127 if( ERROR_SUCCESS != lreturn )
00128 {
00129 RegCloseKey( hkey );
00130 RegCloseKey( hsubkey );
00131 return AmHresultFromWin32(lreturn);
00132 }
00133
00134 wsprintf( achTemp, TEXT("%ls"), szThreadingModel );
00135 lreturn = RegSetValueEx( hsubkey
00136 , TEXT("ThreadingModel")
00137 , 0L
00138 , REG_SZ
00139 , (CONST BYTE *)achTemp
00140 , sizeof(TCHAR) * (lstrlen(achTemp)+1) );
00141
00142 RegCloseKey( hkey );
00143 RegCloseKey( hsubkey );
00144
00145 return HRESULT_FROM_WIN32(lreturn);
00146
00147 }
00148
00149 STDAPI
00150 AMovieSetupUnregisterServer( CLSID clsServer )
00151 {
00152
00153 OLECHAR szCLSID[CHARS_IN_GUID];
00154 HRESULT hr = StringFromGUID2( clsServer
00155 , szCLSID
00156 , CHARS_IN_GUID );
00157 ASSERT( SUCCEEDED(hr) );
00158
00159 TCHAR achBuffer[MAX_KEY_LEN];
00160 wsprintf( achBuffer, TEXT("CLSID\\%ls"), szCLSID );
00161
00162 hr = EliminateSubKey( HKEY_CLASSES_ROOT, achBuffer );
00163 ASSERT( SUCCEEDED(hr) );
00164
00165 return NOERROR;
00166 }
00167
00168 STDAPI
00169 AMovieSetupRegisterFilter2( const AMOVIESETUP_FILTER * const psetupdata
00170 , IFilterMapper2 * pIFM2
00171 , BOOL bRegister )
00172 {
00173 DbgLog((LOG_TRACE, 3, TEXT("= AMovieSetupRegisterFilter")));
00174
00175 if( NULL == psetupdata ) return S_FALSE;
00176
00177 DbgLog((LOG_TRACE, 3, TEXT("= = unregister filter")));
00178 HRESULT hr = pIFM2->UnregisterFilter(
00179 0,
00180 0,
00181 *psetupdata->clsID );
00182
00183 if( bRegister )
00184 {
00185 REGFILTER2 rf2;
00186 rf2.dwVersion = 1;
00187 rf2.dwMerit = psetupdata->dwMerit;
00188 rf2.cPins = psetupdata->nPins;
00189 rf2.rgPins = psetupdata->lpPin;
00190
00191
00192
00193 DbgLog((LOG_TRACE, 3, TEXT("= = register filter")));
00194 hr = pIFM2->RegisterFilter(*psetupdata->clsID
00195 , psetupdata->strName
00196 , 0
00197 , 0
00198 , NULL
00199 , &rf2);
00200 }
00201
00202 if( 0x80070002 == hr)
00203 return NOERROR;
00204 else
00205 return hr;
00206 }
00207
00208 STDAPI
00209 RegisterAllServers( LPCWSTR szFileName, BOOL bRegister )
00210 {
00211 HRESULT hr = NOERROR;
00212
00213 for( int i = 0; i < g_cTemplates; i++ )
00214 {
00215
00216
00217 const CFactoryTemplate *pT = &g_Templates[i];
00218
00219 DbgLog((LOG_TRACE, 2, TEXT("- - register %ls"),
00220 (LPCWSTR)pT->m_Name ));
00221
00222
00223
00224 if( bRegister )
00225 {
00226 hr = AMovieSetupRegisterServer( *(pT->m_ClsID)
00227 , (LPCWSTR)pT->m_Name
00228 , szFileName );
00229 }
00230 else
00231 {
00232 hr = AMovieSetupUnregisterServer( *(pT->m_ClsID) );
00233 }
00234
00235
00236
00237
00238 if( FAILED(hr) )
00239 break;
00240 }
00241
00242 return hr;
00243 }
00244
00245 STDAPI
00246 AMovieDllRegisterServer2( BOOL bRegister )
00247 {
00248 HRESULT hr = NOERROR;
00249
00250 DbgLog((LOG_TRACE, 2, TEXT("AMovieDllRegisterServer2()")));
00251
00252
00253 WCHAR achFileName[MAX_PATH];
00254
00255 {
00256 char achTemp[MAX_PATH];
00257
00258 DbgLog((LOG_TRACE, 2, TEXT("- get module file name")));
00259
00260
00261
00262 ASSERT(g_hInst != 0);
00263
00264 if( 0 == GetModuleFileNameA( g_hInst
00265 , achTemp
00266 , sizeof(achTemp) ) )
00267 {
00268
00269 DWORD dwerr = GetLastError();
00270 return AmHresultFromWin32(dwerr);
00271 }
00272
00273 MultiByteToWideChar( CP_ACP
00274 , 0L
00275 , achTemp
00276 , lstrlenA(achTemp) + 1
00277 , achFileName
00278 , sizeof(achFileName) );
00279 }
00280
00281
00282
00283
00284 if( bRegister )
00285 {
00286 DbgLog((LOG_TRACE, 2, TEXT("- register OLE Servers")));
00287 hr = RegisterAllServers( achFileName, TRUE );
00288 }
00289
00290 if( SUCCEEDED(hr) )
00291 {
00292
00293 DbgLog((LOG_TRACE, 2, TEXT("- CoInitialize")));
00294 hr = CoInitialize( (LPVOID)NULL );
00295 ASSERT( SUCCEEDED(hr) );
00296
00297
00298
00299 DbgLog((LOG_TRACE, 2, TEXT("- obtain IFilterMapper2")));
00300 IFilterMapper2 *pIFM2 = 0;
00301 IFilterMapper *pIFM = 0;
00302 hr = CoCreateInstance( CLSID_FilterMapper2
00303 , NULL
00304 , CLSCTX_INPROC_SERVER
00305 , IID_IFilterMapper2
00306 , (void **)&pIFM2 );
00307 if(FAILED(hr))
00308 {
00309 DbgLog((LOG_TRACE, 2, TEXT("- trying IFilterMapper instead")));
00310
00311 hr = CoCreateInstance(
00312 CLSID_FilterMapper,
00313 NULL,
00314 CLSCTX_INPROC_SERVER,
00315 IID_IFilterMapper,
00316 (void **)&pIFM);
00317 }
00318 if( SUCCEEDED(hr) )
00319 {
00320
00321
00322
00323 DbgLog((LOG_TRACE, 2, TEXT("- register Filters")));
00324 for( int i = 0; i < g_cTemplates; i++ )
00325 {
00326
00327
00328 const CFactoryTemplate *pT = &g_Templates[i];
00329
00330 if( NULL != pT->m_pAMovieSetup_Filter )
00331 {
00332 DbgLog((LOG_TRACE, 2, TEXT("- - register %ls"), (LPCWSTR)pT->m_Name ));
00333
00334 if(pIFM2)
00335 {
00336 hr = AMovieSetupRegisterFilter2( pT->m_pAMovieSetup_Filter, pIFM2, bRegister );
00337 }
00338 else
00339 {
00340 hr = AMovieSetupRegisterFilter( pT->m_pAMovieSetup_Filter, pIFM, bRegister );
00341 }
00342 }
00343
00344
00345
00346
00347 if( FAILED(hr) )
00348 break;
00349 }
00350
00351
00352
00353 if(pIFM2)
00354 pIFM2->Release();
00355 else
00356 pIFM->Release();
00357
00358 }
00359
00360
00361
00362 CoFreeUnusedLibraries();
00363 CoUninitialize();
00364 }
00365
00366
00367
00368
00369 if( SUCCEEDED(hr) && !bRegister )
00370 {
00371 DbgLog((LOG_TRACE, 2, TEXT("- register OLE Servers")));
00372 hr = RegisterAllServers( achFileName, FALSE );
00373 }
00374
00375 DbgLog((LOG_TRACE, 2, TEXT("- return %0x"), hr));
00376 return hr;
00377 }
00378
00379 STDAPI
00380 AMovieDllRegisterServer( void )
00381 {
00382 HRESULT hr = NOERROR;
00383
00384
00385
00386
00387 WCHAR achFileName[MAX_PATH];
00388
00389 {
00390
00391
00392 char achTemp[MAX_PATH];
00393
00394 if( 0 == GetModuleFileNameA( g_hInst
00395 , achTemp
00396 , sizeof(achTemp) ) )
00397 {
00398
00399 DWORD dwerr = GetLastError();
00400 return AmHresultFromWin32(dwerr);
00401 }
00402
00403 MultiByteToWideChar( CP_ACP
00404 , 0L
00405 , achTemp
00406 , lstrlenA(achTemp) + 1
00407 , achFileName
00408 , sizeof(achFileName) );
00409 }
00410
00411
00412
00413
00414 for( int i = 0; i < g_cTemplates; i++ )
00415 {
00416
00417
00418 const CFactoryTemplate *pT = &g_Templates[i];
00419
00420
00421
00422 hr = AMovieSetupRegisterServer( *(pT->m_ClsID)
00423 , (LPCWSTR)pT->m_Name
00424 , achFileName );
00425
00426
00427
00428
00429
00430 if( SUCCEEDED(hr) && (NULL != pT->m_lpfnNew) )
00431 {
00432
00433
00434 PAMOVIESETUP psetup;
00435 hr = CoCreateInstance( *(pT->m_ClsID)
00436 , 0
00437 , CLSCTX_INPROC_SERVER
00438 , IID_IAMovieSetup
00439 , reinterpret_cast<void**>(&psetup) );
00440 if( SUCCEEDED(hr) )
00441 {
00442 hr = psetup->Unregister();
00443 if( SUCCEEDED(hr) )
00444 hr = psetup->Register();
00445 psetup->Release();
00446 }
00447 else
00448 {
00449 if( (E_NOINTERFACE == hr )
00450 || (VFW_E_NEED_OWNER == hr ) )
00451 hr = NOERROR;
00452 }
00453 }
00454
00455
00456
00457
00458 if( FAILED(hr) )
00459 break;
00460
00461 }
00462
00463 return hr;
00464 }
00465
00466 STDAPI
00467 AMovieDllUnregisterServer()
00468 {
00469
00470
00471 HRESULT hr = NOERROR;
00472
00473
00474
00475
00476 for( int i = g_cTemplates; i--; )
00477 {
00478
00479
00480 const CFactoryTemplate *pT = &g_Templates[i];
00481
00482
00483
00484 if( NULL != pT->m_lpfnNew )
00485 {
00486
00487
00488 PAMOVIESETUP psetup;
00489 hr = CoCreateInstance( *(pT->m_ClsID)
00490 , 0
00491 , CLSCTX_INPROC_SERVER
00492 , IID_IAMovieSetup
00493 , reinterpret_cast<void**>(&psetup) );
00494 if( SUCCEEDED(hr) )
00495 {
00496 hr = psetup->Unregister();
00497 psetup->Release();
00498 }
00499 else
00500 {
00501 if( (E_NOINTERFACE == hr )
00502 || (VFW_E_NEED_OWNER == hr ) )
00503 hr = NOERROR;
00504 }
00505 }
00506
00507
00508
00509 if( SUCCEEDED(hr) )
00510 {
00511 hr = AMovieSetupUnregisterServer( *(pT->m_ClsID) );
00512 }
00513
00514
00515
00516
00517 if( FAILED(hr) )
00518 break;
00519 }
00520
00521 return hr;
00522 }