how to cancel autoplay in xp[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 kuanghong 的 blog

#include <windows.h>
#include <shobjidl.h>
#include <shlobj.h>
#include <assert.h>


bool cancelremovedriverautoplay( bool b );

static hresult _registerforiquerycancelautoplay(  dword* pdwregisterrot);
static hresult _unregisterforiquerycancelautoplay(dword dwregisterrot);
static bool iswindowsxporgreater();


bool cancelremovedriverautoplay( bool b )
{
 if( !iswindowsxporgreater() )
 {
  return false;
 }
 static bool s_bautoplaycanceled = false;
 static dword s_dwrot=0;

 if( s_bautoplaycanceled == b )
 {
  return true;
 }

 if( 0 == s_dwrot )
 {
  if( b )
  {
   hresult hr = _registerforiquerycancelautoplay(&s_dwrot );
   if( succeeded(hr) )
   {
    s_bautoplaycanceled = true;
    return true;    
   }
   else
   {
    assert(0);
    return false;
   }
  }
  else
  {
   return true;
  }
 }
 else
 {
  if( b )
  {
   return true;
  }
  else
  {
   hresult hr = _unregisterforiquerycancelautoplay( s_dwrot );
   if( succeeded(hr) )
   {
    s_dwrot = 0;
    s_bautoplaycanceled = false;
    return true;
   }
   else
   {
    assert(0);
    return false;
   }
  }
 } 
}

static bool iswindowsxporgreater()
{
 osversioninfoexa osvi = {0};

 osvi.dwosversioninfosize = sizeof(osvi);

 if (!getversionexa((osversioninfoa*)&osvi))
 {
  // if it failed, it must be a down level platform
  osvi.dwosversioninfosize = sizeof(osversioninfoa);
  getversionexa((osversioninfoa*)&osvi);
 }

 return (ver_platform_win32_nt == osvi.dwplatformid &&
  ((osvi.dwmajorversion > 5) ||
  (osvi.dwmajorversion == 5 && (osvi.dwminorversion > 0 ||
  (osvi.dwminorversion == 0 && loword(osvi.dwbuildnumber) > 2195)))));
}


class cquerycancelautoplay : public iquerycancelautoplay
{
public:
 // iunknown interface
 stdmethodimp queryinterface(refiid riid, void** ppv);
 stdmethodimp_(ulong) addref();
 stdmethodimp_(ulong) release();

 // iquerycancelautoplay interface
 stdmethodimp allowautoplay(lpcwstr pszpath, dword dwcontenttype,
  lpcwstr pszlabel, dword dwserialnumber);

public:
 cquerycancelautoplay() : m_cref(1){}
 ~cquerycancelautoplay(){}
private:
 ulong               m_cref;
};


static hresult getcancelautoplaymoniker(imoniker** ppmoniker)
{
 // create the moniker that we'll put in the rot 
 return createclassmoniker(clsid_querycancelautoplay, ppmoniker);
}

hresult _registerforiquerycancelautoplay( dword* pdwregisterrot)
{
 imoniker* pmoniker =null;

 hresult hr = getcancelautoplaymoniker( &pmoniker);

 if (succeeded(hr))
 {
  irunningobjecttable* prot = null;
  hr = getrunningobjecttable(0, &prot);

  if (succeeded(hr))
  {
   cquerycancelautoplay* pqca = new cquerycancelautoplay();
   if ( null != pqca )
   {
     iunknown* punk=null;

     hr = pqca->queryinterface(iid_iunknown, (void**)&punk);

     if (succeeded(hr))
     {
      // register...
      hr = prot->register(rotflags_registrationkeepsalive,
       punk, pmoniker, pdwregisterrot);

本文关键:how to cancel autoplay in xp
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top