首页
社区
课程
招聘
[旧帖] [求助]SHELL扩展添加右键菜单出错 0.00雪花
发表于: 2013-9-28 19:00 1669

[旧帖] [求助]SHELL扩展添加右键菜单出错 0.00雪花

2013-9-28 19:00
1669
我已经用atl编写了一个SHELL扩展添加右键菜单的dll,编译好以后,点击桌面会弹出我的右键菜单,并执行我的程序,即显示一个messagebox。
然后,不可思议的事情出现了,运行win7的便笺,新建便笺,尽然弹出我的菜单程序?
莫名其妙。事实是,不光便笺,点击“入门”,然后弹出“入门”的二级菜单,点击二级菜单任意一项,都会弹出我的MessageBox。进一步发现,从start键然后点击很多windows自带二级菜单的程序,弹出“二级菜单”以后,点击“二级菜单”,其菜单不是本来设置好的windows自己的程序,而都变成了我设置的MessageBox。莫名其妙。shell扩展右键菜单dll,我的程序哪里出错了?
下图是截图保存AVI以后,再转的GIF,图像有点色素不对,请包涵。
附上“右键菜单” dll.rar
dll文件,先要把s.dll改名成ee.dll拷贝到c:\
也就是存在c:\ee.dll,再运行regsvr32 c:\ee.dll,注册完毕,右键点击文件就会弹出"555"二级菜单
郁闷的是点击“开始”->"便笺"->"新建便笺",也会弹出我编写的MessageBox,何解?

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
看雪不支持动态GIF吗?我上传的动态GIF怎么不能动了?
图片预览都不能动啊,请下载整个GIF观看。
图片下载。http://pan.baidu.com/s/187YJ3
2013-9-28 19:09
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
源码如下,不知道哪里有错误?

// rr.h: Definition of the rr class
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_RR_H__974B3E4B_B3D9_4D88_8143_D287E29CEC2A__INCLUDED_)
#define AFX_RR_H__974B3E4B_B3D9_4D88_8143_D287E29CEC2A__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "shlobj.h"
#include "comdef.h"
#include "resource.h"       // main symbols

/////////////////////////////////////////////////////////////////////////////
// rr

class rr :
        public IDispatchImpl<Irr, &IID_Irr, &LIBID_EELib>,
        public CComObjectRoot,
        public CComCoClass<rr,&CLSID_rr>,
        public IShellExtInit,
    public IContextMenu
{

BEGIN_COM_MAP(rr)
        COM_INTERFACE_ENTRY(IDispatch)
        COM_INTERFACE_ENTRY(Irr)
        COM_INTERFACE_ENTRY(IShellExtInit)
    COM_INTERFACE_ENTRY(IContextMenu)
END_COM_MAP()
//DECLARE_NOT_AGGREGATABLE(rr)
// Remove the comment from the line above if you don't want your object to
// support aggregation.

DECLARE_REGISTRY_RESOURCEID(IDR_rr)
// ISupportsErrorInfo
        STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid);

// Irr
public:
// IShellExtInit
    STDMETHOD(Initialize)(LPCITEMIDLIST, LPDATAOBJECT, HKEY);

// IContextMen
    STDMETHOD(GetCommandString)(UINT, UINT, UINT*, LPSTR, UINT);
    STDMETHOD(InvokeCommand)(LPCMINVOKECOMMANDINFO);
    STDMETHOD(QueryContextMenu)(HMENU, UINT, UINT, UINT, UINT);

};

#endif // !defined(AFX_RR_H__974B3E4B_B3D9_4D88_8143_D287E29CEC2A__INCLUDED_)

// rr.cpp : Implementation of CEeApp and DLL registration.

#include "stdafx.h"
#include "ee.h"
#include "rr.h"

/////////////////////////////////////////////////////////////////////////////
//

STDMETHODIMP rr::InterfaceSupportsErrorInfo(REFIID riid)
{
        return S_OK;
}

HRESULT rr::Initialize ( LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID )
{
{FORMATETC fmt = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stg = { TYMED_HGLOBAL };
HDROP hDrop;
TCHAR szFile [MAX_PATH];
int nNumFiles;

// 在数据对象内查找 CF_HDROP 型数据.
if ( FAILED( pDataObj->GetData ( &fmt, &stg )))
{
// Nope! Return an "invalid argument" error back to Explorer.
return E_INVALIDARG;
}

// 获得指向实际数据的指针
hDrop = (HDROP) GlobalLock ( stg.hGlobal );

// 检查非NULL.
if ( NULL == hDrop )
{
return E_INVALIDARG;
}

// 检查在该操作中有几个文件被选择.
nNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );

if(0 == nNumFiles)
{
  GlobalUnlock ( stg.hGlobal );
  ReleaseStgMedium ( &stg );
  return E_INVALIDARG;
}

/*// 有效性检查 – 保证最少有一个文件名.
UINT uNumFiles = DragQueryFile ( hDrop, 0xFFFFFFFF, NULL, 0 );
if ( 0 == uNumFiles )
{
GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return E_INVALIDARG;
} */

for ( int uFile = 0; uFile < nNumFiles; uFile++ )
{
  //取得下一个文件名.
  if ( 0 == DragQueryFile ( hDrop,
  uFile, szFile, MAX_PATH ))
  continue;

  //m_lsFiles.AddTail(szFile);
  //m_mapInt2StrFiles[uFile] = szFile;

} // end for

GlobalUnlock ( stg.hGlobal );
ReleaseStgMedium ( &stg );
return  S_OK ;
}
}

HRESULT rr::QueryContextMenu ( HMENU hmenu,UINT uMenuIndex, UINT uidFirstCmd, UINT uidLastCmd, UINT uFlags )
{         
UINT uCmdID = uidFirstCmd;

char *szMenuText_Popup = "自定义菜单";
char *szMenuText_1 = "自定义菜单1...";
char *szMenuText_2 = "自定义菜单2...";
char *szMenuText_3 = "自定义菜单3...";
char *szMenuText_4 = "自定义菜单4...";

// 如果标志包含 CMF_DEFAULTONLY 我们不作任何事情.
if ( uFlags & CMF_DEFAULTONLY )
{
  return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );
}

if ( uFlags & CMF_VERBSONLY )
{
  return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 0 );
}

//InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
uMenuIndex++;

HMENU hSubMenu = CreateMenu();
struct HBITMAP__ * m_hRegBmp=0;
if(hSubMenu)
{
  InsertMenu(hSubMenu, 0, MF_STRING  | MF_BYPOSITION, uCmdID++, "111");
  SetMenuItemBitmaps(hSubMenu, 0, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);

  InsertMenu(hSubMenu, 1, MF_STRING  | MF_BYPOSITION, uCmdID++, "222");
  SetMenuItemBitmaps(hSubMenu, 1, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);

  //InsertMenu(hSubMenu, 2, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);

  InsertMenu(hSubMenu, 2, MF_STRING  | MF_BYPOSITION, uCmdID++, "333");
  SetMenuItemBitmaps(hSubMenu, 2, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);

  InsertMenu(hSubMenu, 3, MF_STRING  | MF_BYPOSITION, uCmdID++, "444");
  SetMenuItemBitmaps(hSubMenu, 3, MF_BYPOSITION, m_hRegBmp, m_hRegBmp);
}

InsertMenu(hmenu, uMenuIndex, MF_STRING | MF_POPUP | MF_BYPOSITION, (UINT_PTR)hSubMenu, "555");
//uMenuIndex++;

//InsertMenu(hmenu, uMenuIndex, MF_SEPARATOR | MF_BYPOSITION, 0, NULL);
//uMenuIndex++;
   
//最后告诉浏览器我们添加了几个菜单项
return MAKE_HRESULT ( SEVERITY_SUCCESS, FACILITY_NULL, 4 );
}

HRESULT rr::GetCommandString(UINT a, UINT b, UINT * cc, LPSTR d, UINT e)
        {return S_OK;}
HRESULT rr::InvokeCommand(LPCMINVOKECOMMANDINFO tt)
        {MessageBox(0,"12345","12345",0);
        return S_OK;}
2013-9-28 23:19
0
雪    币: 8
活跃值: (233)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
MSDN查阅了一下,和下面的信息有关,不知道什么意思。
CMF_OPTIMIZEFORINVOKE
        0x00000800. Windows 7 and later. Informs context menu handlers that do not support the invocation of
a verb through a canonical verb name to bypass IContextMenu3::QueryContextMenu in their implementation.
2013-9-29 07:58
0
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
MARK一下,回头看看!
2013-11-24 17:55
0
游客
登录 | 注册 方可回帖
返回
//