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 + -
显示快捷键?