dllsetup.cpp.svn-base
来自「ffshow源码」· SVN-BASE 代码 · 共 693 行 · 第 1/2 页
SVN-BASE
693 行
//---------------------------------------------------------------------------//// 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.////---------------------------------------------------------------------------STDAPIAMovieDllRegisterServer2( 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.////---------------------------------------------------------------------------STDAPIAMovieDllRegisterServer( 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////---------------------------------------------------------------------------STDAPIAMovieDllUnregisterServer(){ // 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;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?