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; }
// // DllRegisterServer // // Exported entry points for registration and unregistration // STDAPI DllRegisterServer() { HRESULT hr = AMovieDllRegisterServer2( TRUE ); if (FAILED(hr)) return hr; CoInitialize(0); IFilterMapper2 *fm = NULL; hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, IID_IFilterMapper2,(LPVOID*)&fm); if( FAILED(hr) ) { CoFreeUnusedLibraries(); CoUninitialize(); return hr; } IMoniker *pMoniker = 0; REGFILTER2 videoFilterReg; videoFilterReg.dwVersion = 1; videoFilterReg.dwMerit = MERIT_DO_NOT_USE; videoFilterReg.cPins = 1; videoFilterReg.rgPins = &sudVideoPin; hr = fm->RegisterFilter(CLSID_OpenNIVideo, g_videoName, &pMoniker, &CLSID_VideoInputDeviceCategory, NULL, &videoFilterReg); if( FAILED(hr) ) { CoFreeUnusedLibraries(); CoUninitialize(); return hr; } // release interface // if(fm) fm->Release(); CoFreeUnusedLibraries(); CoUninitialize(); return hr; } // DllRegisterServer
//The folowing two functions do the registration and deregistration of the dll and it's contained com objects. STDAPI DllRegisterServer() { //TO DO::: Should we be releasing the filter mapper even when we return early ? HRESULT hr; IFilterMapper2* locFilterMapper = NULL; hr = AMovieDllRegisterServer2(TRUE); if (FAILED(hr)) { return hr; } hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER, IID_IFilterMapper2, (void **)&locFilterMapper); if (FAILED(hr)) { return hr; } hr = locFilterMapper->RegisterFilter( CLSID_AnxDemuxSourceFilter, // Filter CLSID. L"Annodex Demux Source Filter", // Filter name. NULL, // Device moniker. &CLSID_LegacyAmFilterCategory, // Direct Show general category L"Annodex Demux Source Filter", // Instance data. ??????? &AnxDemuxSourceFilterReg // Pointer to filter information. ); locFilterMapper->Release(); return hr; }