我用ATL COM Appwizard写了一个windows扩展壳 但是点击文件夹的右键和点击文件的右键不一样

LBJAMS 2013-03-05 11:01:28
我是为系统的右键添加一个菜单,点击文件夹的时候添加的菜单添加上去了,点击文件的时候添加的菜单没有添加上去,这是为什么?
...全文
389 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
LBJAMS 2013-03-08
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
参考 Microsoft SDK\samples\winui\Shell\ShellExt\*.* MSDN98\SAMPLES\VC98\SDK\WINUI\SHELL\SHELLEXT\*.* ?
我已经解决了,和这个没有关系 HRESULT Initialize( PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID ); 和这个函数的第二个参数有关系。
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
参考 Microsoft SDK\samples\winui\Shell\ShellExt\*.* MSDN98\SAMPLES\VC98\SDK\WINUI\SHELL\SHELLEXT\*.* ?
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
// IShellExtInit::Initialize
HRESULT CCopyPathExt::Initialize(LPCITEMIDLIST /*pidlFolder*/, LPDATAOBJECT lpdobj, HKEY /*hKeyProgID*/)
{
    try {

        if ( lpdobj == NULL )
            return E_INVALIDARG;


        const HINSTANCE hinst = _Module.GetResourceInstance();
        if ( hinst ) {
            m_hbmpUnchecked = ::LoadBitmap( hinst, MAKEINTRESOURCE( IDB_CopyPath ) );
            if ( m_hbmpUnchecked ) {
                // We loaded the bitmap, so attach the CBitmap to it.
                VERIFY( m_bmp.Attach ( m_hbmpUnchecked ) );
            }
        }

        // Get the data as CF_HDROP
        STGMEDIUM medium;
        FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
        HRESULT hr = lpdobj->GetData( &fe, &medium );
        if ( FAILED( hr ) )
            return E_INVALIDARG;

        // Get the number of selected files
        m_cFiles = DragQueryFile( reinterpret_cast<HDROP>(medium.hGlobal), 0xFFFFFFFF, NULL, NULL );

        // Build the list of file names
        m_lstFiles.clear();
        for ( int iFile = 0; iFile < m_cFiles; iFile++ )
        {
            // Get the name of the selected file
            memset( m_szFile, 0, sizeof m_szFile );
            DragQueryFile( reinterpret_cast<HDROP>(medium.hGlobal),
                           iFile,
                           m_szFile,
                           sizeof(m_szFile)/sizeof(m_szFile[0]) );
            m_lstFiles.push_back( m_szFile );
        }

        ReleaseStgMedium(&medium);
        return hr;

    } catch ( ... ) {
        return E_FAIL;
    }
}
LBJAMS 2013-03-07
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
带着你的问题在http://www.codeproject.com上搜,应该会找到答案的。
这个问题已经解决,分给你了,现在想请教下IShellExtInit::Initialize这个函数 HRESULT Initialize( PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID ); 我理解的是第一参数是指向的选中的文件夹的完整路径,但是我用log打出来不是,是加载的dll的全路径,请问怎么可以获取我点击的那个文件或文件夹的全路径呢?谢谢!
LBJAMS 2013-03-06
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
带着你的问题在http://www.codeproject.com上搜,应该会找到答案的。
主要是本人英语不好,试试看吧!!
赵4老师 2013-03-06
  • 打赏
  • 举报
回复
带着你的问题在http://www.codeproject.com上搜,应该会找到答案的。
LBJAMS 2013-03-06
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
我也没实际遇到过类似的问题。 不过你可以试试修改相应注册表项(网上搜搜看)先设置让explorer.exe退出后不要自动重启, 再在任务管理器中结束explorer.exe 然后按Ctrl+Alt+Del找到新建任务对话框,在里面运行调试器比如VS IDE或Windbg,然后在调试器中加载explorer.exe,应该就能调试你的代码了(可能还需要事先在编译链接……
多级菜单添加已经成功,想请教你一个别的问题,金山快盘,托盘程序,把鼠标移动到上面去就会弹出一个对话框,这是什么怎么回事,并不是像QQ的提示语那样的,那个我知道是怎么回事,谢谢!
赵4老师 2013-03-05
  • 打赏
  • 举报
回复
关注一下注册表项 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell] 和 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell]
LBJAMS 2013-03-05
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
在http://www.codeproject.com搜“Shell Extension”
这个网站我已经上过了,东西也搜索过了,也找到了类似的东西,但是我看不出看来和我写的有什么不同,Initialize,GetCommandString,InvokeCommand,QueryContextMenu主要是使用这4个函数,这四个函数基本是一样的,我调试了一下,点击文件夹的时候这四个函数调用了,点击文件的时候这四个函数没有一个调用的,我找到的那个例子项目是都调用了,我觉得是不是有什么入口?但是没看出来,这个东西也不知道怎么调试,正在研究windbg!
赵4老师 2013-03-05
  • 打赏
  • 举报
回复
http://www.codeproject.com搜“Shell Extension”
LBJAMS 2013-03-05
  • 打赏
  • 举报
回复
引用 2 楼 miaochunxiang1 的回复:
引用 1 楼 zhao4zhong1 的回复:在http://www.codeproject.com搜“Shell Extension” 这个网站我已经上过了,东西也搜索过了,也找到了类似的东西,但是我看不出看来和我写的有什么不同,Initialize,GetCommandString,InvokeCommand,QueryContextMenu主要是使用这4个函数……
我使用windbg打开一个源文件想打断点的时候提示 Debuggee must be stopped before breakpoints can be modified这是为什么?
赵4老师 2013-03-05
  • 打赏
  • 举报
回复
我也没实际遇到过类似的问题。 不过你可以试试修改相应注册表项(网上搜搜看)先设置让explorer.exe退出后不要自动重启, 再在任务管理器中结束explorer.exe 然后按Ctrl+Alt+Del找到新建任务对话框,在里面运行调试器比如VS IDE或Windbg,然后在调试器中加载explorer.exe,应该就能调试你的代码了(可能还需要事先在编译链接你的代码时指定生成对应的.pdb文件)
LBJAMS 2013-03-05
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
关注一下注册表项 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell] 和 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell]
还有我想添加多级的菜单,在我下载的例子项目里我在QueryContextMenu这个函数里面使用了一个CMenu menu; menu.LoadMenu(IDR_MENU1); InsertMenu (hmenu, uMenuIndex, MF_POPUP,(UINT)menu.GetSubMenu(0).m_hMenu, mstr); 这样是可以的,添加多级菜单是正确的,但是我自己建的项目这样做就是错误的,把(UINT)menu.GetSubMenu(0).m_hMenu, mstr);这句话改成(UINT)menu.GetSubMenu(0)->m_hMenu, mstr);编译成功,但是在注册之后点击文件的右键就会报错,然后刷屏(执行explorer.exe),不知道这是什么原因,是创建项目的类型不同,还是有哪些代码没有写正确?请指教!
LBJAMS 2013-03-05
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
关注一下注册表项 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\*\shell] 和 [HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell]
我看的出来一个是关于文件夹的,一个是关于文件的,但是写程序的时候我只在注册表HKEY_CLASSES_ROOT\Directory\Shellex\ContextMenuHandlers 的这个位置加了东西就可以了(下载的例子项目),这样点击文件和文件夹的时候都是会有显示添加的菜单项,你说详细点可以吗?

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧