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