HRESULT CProtocolHandlerRegistrar::RegisterTemporaryHandler(
  LPCWSTR lpszScheme,
  LPCWSTR lpszHost,
  RT      tResourceID)
{
  CritSectLock lock(m_CriticalSection);
  BOOL registered = FALSE;

  CComObject<CF> *pHandlerFactory = NULL;
  CComPtr<IClassFactory> pClassFactory;

  // lookup class factory for lpszScheme
  if (!m_ClassFactories.Lookup(lpszScheme, pClassFactory))
  {
    // don't have yet, create class factory object
    IF_FAILED_RET(CComObject<CF>
      ::CreateInstance(&pHandlerFactory));

    pClassFactory = pHandlerFactory;

    // init classfactory object
    IF_FAILED_RET(pHandlerFactory->Init(
      lpszScheme));
  }
  else
  {
    // have class factory
    registered = TRUE;
    pHandlerFactory = (CComObject<CF> *)pClassFactory.p;
  }

  // add the host
  IF_FAILED_RET(pHandlerFactory->AddHost(
    lpszHost, tResourceID));

  // register protocol handler
  if (!registered)
  {
    // get IInternetSession
    CComPtr<IInternetSession> pInternetSession;
    IF_FAILED_RET(CoInternetGetSession(0, &pInternetSession, 0));

    IF_FAILED_RET(pInternetSession->RegisterNameSpace(
      pClassFactory,
      CTemporaryProtocolFolderHandler::CLSID,
      lpszScheme,
      0, NULL, 0));

    // store classfactory object
    m_ClassFactories[lpszScheme] = pClassFactory;
  }

  return S_OK;
}