转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 电脑应用 >> 电脑技术 >> 正文
how to cancel autoplay in xp         ★★★

how to cancel autoplay in xp

作者:闵涛 文章来源:闵涛的学习笔记 点击数:951 更新时间:2006/7/27

#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);

      punk->Release();
     }
    pQCA->Release();    
   }
   else
   {
    hr = E_OUTOFMEMORY;
   }
   prot->Release();
  }
  pmoniker->Release();
 }
 return hr;
}

HRESULT _UnregisterForIQueryCancelAutoplay(DWORD dwRegisterROT)
{
 IRunningObjectTable *prot;
 if (SUCCEEDED(GetRunningObjectTable(0, &prot)))
 {
  // Remove our instance from the ROT
  prot->Revoke(dwRegisterROT);
  prot->Release();
 }
 return S_OK;
}


STDMETHODIMP CQueryCancelAutoplay::QueryInterface(REFIID riid, void** ppv)
{
 IUnknown* punk = NULL;
 HRESULT hr = S_OK;

 if (IID_IUnknown == riid)
 {
  punk = static_cast<IUnknown*>(this);
  punk->AddRef();
 }
 else
 {
  if (IID_IQueryCancelAutoPlay == riid)
  {
   punk = static_cast<IQueryCancelAutoPlay*>(this);
   punk->AddRef();
  }
  else
  {
   hr = E_NOINTERFACE;
  }
 }

 *ppv = punk;

 return hr;
}

STDMETHODIMP_(ULONG) CQueryCancelAutoplay::AddRef()
{
 return ::InterlockedIncrement((LONG*)&m_cRef);
}

STDMETHODIMP_(ULONG) CQueryCancelAutoplay::Release()
{
 ULONG cRef = ::InterlockedDecrement((LONG*)&m_cRef);

 if (!cRef)
 {
  delete this;
 }

 return cRef;
}

STDMETHODIMP CQueryCancelAutoplay::AllowAutoPlay(LPCWSTR pszPath,
             DWORD dwContentType, LPCWSTR pszLabel, DWORD dwSerialNumber)
{
 HRESULT hr = S_OK;
 //do what you want to do
 //return S_FALSE to cancel the autoplay
 //return S_OK to do autoplay
 return hr;
}


[办公软件]在Excel中插入时间/日期TODAY和NOW函数  [网络安全]激活型触发式AutoRun.inf病毒和rose病毒的清除方案
[Web开发]asp.net c#其它语句之break、continue、goto实例介…  [Web开发]一大堆常用的超强的正则表达式及RegularExpressio…
[平面设计]制作动态GIF图像的好帮手─Coffee GIf Animator  [平面设计]功能超强的GIF动画制作软件─Ulead Gif Animator
[平面设计]AutoCAD常用快捷命令(外加中文说明)  [平面设计]AutoCAD常用快捷命令(字母类,外加中文说明)
[平面设计]AutoCAD快捷命令介绍  [平面设计]多种方法解决AutoCAD打印时出现错误
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 电脑技术  · 操作系统
    · 磁盘工具  · 视音频技术
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台