怎么使用一个com组件类来对一个文件路径进行图标重叠操作
如何使用一个com组件类来对一个文件路径进行图标重叠操作
对已经生成好的一个OverlayIcon.dll,生成这个dll动态库的h文件:(使用IShellIconOverlayIdentifier接口)
class ATL_NO_VTABLE CMyOverlayIcon :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyOverlayIcon, &CLSID_MyOverlayIcon>,
public IDispatchImpl<IMyOverlayIcon, &IID_IMyOverlayIcon, &LIBID_OverlayIconLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IShellIconOverlayIdentifier
{
public:
CMyOverlayIcon()
{
}
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()
// IShellIconOverlayIdentifier Methods
STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile,int cchMax,int *pIndex,DWORD* pdwFlags);
STDMETHOD(GetPriority)(int* pPriority);
STDMETHOD(IsMemberOf)(LPCWSTR pwszPath,DWORD dwAttrib);
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
};
我的问题是
1 怎么样在另一个工程中使用那个dll文件,如何加载这个动态库?
2 调用这个com组件的方法?
3 这个实现图标重叠的com组件,一共有
用IsMemberOf来判断是否是你需要叠加图标的对象
用GetPriority来指定你叠加图标的优先级
用GetOverlayInfo来指定图标路径和图标索引号
这三个方法,我的问题是:
因为要对一个文件的路径进行操作,怎么样使用IsMemberof()、GetPriority()、GetOverlayInfo()这三个方法???
求解~~~~~~
------解决方案--------------------
一般思路是调用DllGetClassObject方法,得到IClassFactory,然后调用IClassFactory的CreateInstance方法获取组件接口指针
------解决方案--------------------
HMODULE hand = ::LoadLibrary(L"OverlayIcon.dll");
if(hand == NULL)
{
MessageBoxA(NULL,"无法加载动态库!","提示",1);
if(hand != NULL)
::FreeLibrary(hand);
return 0;
}//加载动态库
CoInitialize(NULL);
HRESULT hr;
IShellIconOverlayIdentifier* ptr;
CLSID clsid;
IClassFactory* p_classfactory;
hr=CLSIDFromProgID(OLESTR("OverlayIcon.GetRes"),&clsid);//第一个参数应该写什么啊,我用的动态库是OverlayIcon.dll
hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,
NULL,IID_IClassFactory,
(LPVOID*)&p_classfactory);
p_classfactory->CreateInstance(NULL,__uuidof(IShellIconOverlayIdentifier),
(LPVOID*)&ptr);
int cchMax = 0;
int pIndex = 0;
DWORD pdwFlags;
int *pPriority = 0;
if(ptr->IsMemberOf(L("D:\\Work\\1.docx"),pdwFlags))
{
ptr->GetPriority(pPriority);
ptr->GetOverlayInfo(L"my.ico", cchMax, &pIndex, &pdwFlags);
}
我这样用对吗
------解决方案--------------------
www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects
------解决方案--------------------
看来很多大神都开始在整网盘相关的东西啊
对已经生成好的一个OverlayIcon.dll,生成这个dll动态库的h文件:(使用IShellIconOverlayIdentifier接口)
class ATL_NO_VTABLE CMyOverlayIcon :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMyOverlayIcon, &CLSID_MyOverlayIcon>,
public IDispatchImpl<IMyOverlayIcon, &IID_IMyOverlayIcon, &LIBID_OverlayIconLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
public IShellIconOverlayIdentifier
{
public:
CMyOverlayIcon()
{
}
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()
// IShellIconOverlayIdentifier Methods
STDMETHOD(GetOverlayInfo)(LPWSTR pwszIconFile,int cchMax,int *pIndex,DWORD* pdwFlags);
STDMETHOD(GetPriority)(int* pPriority);
STDMETHOD(IsMemberOf)(LPCWSTR pwszPath,DWORD dwAttrib);
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
}
public:
};
我的问题是
1 怎么样在另一个工程中使用那个dll文件,如何加载这个动态库?
2 调用这个com组件的方法?
3 这个实现图标重叠的com组件,一共有
用IsMemberOf来判断是否是你需要叠加图标的对象
用GetPriority来指定你叠加图标的优先级
用GetOverlayInfo来指定图标路径和图标索引号
这三个方法,我的问题是:
因为要对一个文件的路径进行操作,怎么样使用IsMemberof()、GetPriority()、GetOverlayInfo()这三个方法???
求解~~~~~~
------解决方案--------------------
一般思路是调用DllGetClassObject方法,得到IClassFactory,然后调用IClassFactory的CreateInstance方法获取组件接口指针
------解决方案--------------------
HMODULE hand = ::LoadLibrary(L"OverlayIcon.dll");
if(hand == NULL)
{
MessageBoxA(NULL,"无法加载动态库!","提示",1);
if(hand != NULL)
::FreeLibrary(hand);
return 0;
}//加载动态库
CoInitialize(NULL);
HRESULT hr;
IShellIconOverlayIdentifier* ptr;
CLSID clsid;
IClassFactory* p_classfactory;
hr=CLSIDFromProgID(OLESTR("OverlayIcon.GetRes"),&clsid);//第一个参数应该写什么啊,我用的动态库是OverlayIcon.dll
hr=CoGetClassObject(clsid,CLSCTX_INPROC_SERVER,
NULL,IID_IClassFactory,
(LPVOID*)&p_classfactory);
p_classfactory->CreateInstance(NULL,__uuidof(IShellIconOverlayIdentifier),
(LPVOID*)&ptr);
int cchMax = 0;
int pIndex = 0;
DWORD pdwFlags;
int *pPriority = 0;
if(ptr->IsMemberOf(L("D:\\Work\\1.docx"),pdwFlags))
{
ptr->GetPriority(pPriority);
ptr->GetOverlayInfo(L"my.ico", cchMax, &pIndex, &pdwFlags);
}
我这样用对吗
------解决方案--------------------
www.codeproject.com/Articles/7484/How-to-overlay-an-icon-over-existing-shell-objects
------解决方案--------------------
看来很多大神都开始在整网盘相关的东西啊