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; }
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; }
STDAPI RegisterFilters( BOOL bRegister ) { HRESULT hr = NOERROR; WCHAR achFileName[MAX_PATH]; char achTemp[MAX_PATH]; ASSERT(g_hInst != 0); if( 0 == GetModuleFileNameA(g_hInst, achTemp, sizeof(achTemp))) return AmHresultFromWin32(GetLastError()); MultiByteToWideChar(CP_ACP, 0L, achTemp, lstrlenA(achTemp) + 1, achFileName, NUMELMS(achFileName)); hr = CoInitialize(0); if(bRegister) { hr = AMovieSetupRegisterServer(CLSID_OgamaCaptureDesktop, L"OgamaCapture", achFileName, L"Both", L"InprocServer32"); } if( SUCCEEDED(hr) ) { IFilterMapper2 *fm = 0; hr = CreateComObject( CLSID_FilterMapper2, IID_IFilterMapper2, fm ); if( SUCCEEDED(hr) ) { if(bRegister) { IMoniker *pMoniker = 0; REGFILTER2 rf2; rf2.dwVersion = 1; rf2.dwMerit = MERIT_DO_NOT_USE; rf2.cPins = 1; rf2.rgPins = &sudOutputPinDesktop; // this is the name that actually shows up in VLC et al. weird hr = fm->RegisterFilter(CLSID_OgamaCaptureDesktop, L"OgamaCapture", &pMoniker, &CLSID_VideoInputDeviceCategory, NULL, &rf2); } else { hr = fm->UnregisterFilter(&CLSID_VideoInputDeviceCategory, 0, CLSID_OgamaCaptureDesktop); } } // release interface // if(fm) fm->Release(); } if( SUCCEEDED(hr) && !bRegister ) hr = AMovieSetupUnregisterServer( CLSID_OgamaCaptureDesktop ); CoFreeUnusedLibraries(); CoUninitialize(); return hr; }