读书人

悬赏100分:Vista 上 IShellIconOverl

发布时间: 2012-08-02 11:35:25 作者: rapoo

悬赏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

读书人网 >VC/MFC

热点推荐