首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

悬赏100分:Vista 上 IShellIconOverlayIdentifier 接口的使用有关问题

2012-08-02 
悬赏100分:Vista 下 IShellIconOverlayIdentifier 接口的使用问题问题如下:我做一个的项目是vista下的,现

悬赏100分:Vista 下 IShellIconOverlayIdentifier 接口的使用问题
问题如下:
我做一个的项目是vista下的,现在做一个部分是给指定的文件的图标的右下角再加上一个小图标,类似于快捷方式的图标。如图(XP下效果)


我在codeproject找了些资料:
标题:How to overlay an icon over existing shell objects in 3 easy steps
地址:http://www.codeproject.com/KB/shell/overlayicon.aspx?fid=66912&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=871995&fr=26

将程序下载下来后,在vista下死活不行,不过在XP下面OK。
程序的主要代码如下:
// MyOverlayIcon.h : Declaration of the CMyOverlayIcon

#pragma once
#include "resource.h" // main symbols

#include "OverlayIcon.h"


// You can put these includes in "stdafx.h" if you want

#include <shlobj.h>

#include <comdef.h>


// CMyOverlayIcon

class ATL_NO_VTABLE CMyOverlayIcon : 
  public CComObjectRootEx<CComSingleThreadModel>,
  public CComCoClass<CMyOverlayIcon, &CLSID_MyOverlayIcon>,
  public IShellIconOverlayIdentifier,  
  public IDispatchImpl<IMyOverlayIcon, 
  &IID_IMyOverlayIcon, &LIBID_OverlayIconLib, 
  /*wMajor =*/ 1, /*wMinor =*/ 0>
  {
  public:
  CMyOverlayIcon()
  {
  }
  
  // IShellIconOverlayIdentifier Methods

  STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile, 
  int cchMax,int *pIndex,DWORD* pdwFlags);
  STDMETHOD(GetPriority)(int* pPriority);
  STDMETHOD(IsMemberOf)(LPCWSTR pwszPath,DWORD dwAttrib);
  
DECLARE_REGISTRY_RESOURCEID(IDR_MYOVERLAYICON)

  BEGIN_COM_MAP(CMyOverlayIcon)
  COM_INTERFACE_ENTRY(IMyOverlayIcon)
  COM_INTERFACE_ENTRY(IDispatch)
  COM_INTERFACE_ENTRY(IShellIconOverlayIdentifier)  
  END_COM_MAP()

  DECLARE_PROTECT_FINAL_CONSTRUCT()
  HRESULT FinalConstruct()
  {
  return S_OK;
  }
  
  void FinalRelease() 
  {
  }
public:
};

OBJECT_ENTRY_AUTO(__uuidof(MyOverlayIcon), CMyOverlayIcon)

/***********************************************************************************/
// MyOverlayIcon.cpp : Implementation of CMyOverlayIcon


#include "stdafx.h"

#include "MyOverlayIcon.h"



// CMyOverlayIcon

// IShellIconOverlayIdentifier::GetOverlayInfo

// returns The Overlay Icon Location to the system

STDMETHODIMP CCOverlayProvider::GetOverlayInfo(
  LPWSTR pwszIconFile,
  int cchMax,
  int* pIndex,
  DWORD* pdwFlags)
{
  // Get our module's full path

  GetModuleFileNameW(_AtlBaseModule.GetModuleInstance(), pwszIconFile, cchMax);

  // Use first icon in the resource

  *pIndex=0; 

  *pdwFlags = ISIOI_ICONFILE | ISIOI_ICONINDEX;
  return S_OK;
}

// IShellIconOverlayIdentifier::GetPriority

// returns the priority of this overlay 0 being the highest. 

STDMETHODIMP CCOverlayProvider::GetPriority(int* pPriority)
{
  // we want highest priority 

  *pPriority=0;
  return S_OK;
}

// IShellIconOverlayIdentifier::IsMemberOf

// Returns whether the object should have this overlay or not 

STDMETHODIMP CCOverlayProvider::IsMemberOf(LPCWSTR pwszPath, DWORD dwAttrib)
{
  wchar_t *s = _wcsdup(pwszPath);
  HRESULT r = S_FALSE;
  
  _wcslwr(s);

  // Criteria

  if (wcsstr(s, L"codeproject") != 0)


  r = S_OK;

  free(s);

  return r;
}

现在接口是找着了,但是怎么在vista下做?怎么样将这个程序用到vista下面,我想改动应该不是很大,
请高手们指点啊。跪求...

[解决办法]
xp下可以的代码在vista上有什么问题?先Debug一下~
[解决办法]
mark.
[解决办法]
关闭UAC 运行试试?
[解决办法]
注册表,rgs文件写的没问题,问题可能出现在取得图标的路径上。尝试下面的看看?
先把IsMemberOf直接返回 return S_OK;
检查GetOverlayInfo取得图标的路径是否正确!

这个问题我处理过,感兴趣可以加我QQ:148303485
[解决办法]
帮顶
[解决办法]
帮顶
[解决办法]
MK

热点排行