VC 怎么获取选中的文件,文件夹的的决定路径

LBJAMS 2013-03-07 07:10:59
请教下IShellExtInit::Initialize这个函数
HRESULT Initialize( PCIDLIST_ABSOLUTE pidlFolder,
IDataObject *pdtobj,
HKEY hkeyProgID
);
我理解的是第一参数是指向的选中的文件夹的完整路径,但是我用log打出来不是,是加载的dll的全路径,使用的是SHGetPathFromIDList(pidlFolder, m_szFolderDroppedIn);这个函数,第一个参数是获取的路径,是不是我的函数使用的不正确,
请问怎么可以获取我点击的那个文件或文件夹的全路径呢?谢谢!
...全文
318 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
LBJAMS 2013-03-11
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
另外提醒注意5楼代码。
五楼的代码不就是获取到点击的文件或文件夹的名字嘛?选中多个会获取多个?有什么地方指出是文件夹还是文件的地方吗?前几行应该是关于位图的,现在点击文件也会出现我添加的菜单项,是通过修改.rgs文件做到的。
LBJAMS 2013-03-11
  • 打赏
  • 举报
回复
引用 12 楼 zhao4zhong1 的回复:
另外提醒注意5楼代码。
我现在就一个问题,我看了网上的很多资料,但是没有找到Initialize这个函数和选中的是文件还文件夹有关,找不到哪里能指出选中的是文件还是文件夹,请指教!
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
http://www.codeproject.com搜“"Shell Extension to Copy Full Filename Paths"
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
仅供参考
REGEDIT4


[HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}]
   @="ToDir"
[HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}\InProcServer32]
   @="ToDir.dll"
     "ThreadingModel"="Apartment"


[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\ToDir]
   @="{C7BAB981-03C9-11d4-9127-00A0C9392281}"
[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\ToDir]
   @="{C7BAB981-03C9-11d4-9127-00A0C9392281}"
[HKEY_CLASSES_ROOT\Drive\shellex\ContextMenuHandlers\ToDir]
   @="{C7BAB981-03C9-11d4-9127-00A0C9392281}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
   "{C7BAB981-03C9-11d4-9127-00A0C9392281}"="ToDir"
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
另外提醒注意5楼代码。
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
这是从一个对文件、文件夹、逻辑盘都起作用的ToDir.dll(Shell Extension)的注册表项提取结果。 注意其中11、13、15行内容。
漫步者、 2013-03-08
  • 打赏
  • 举报
回复
CFileDialog中有一个成员方法可以获取你选中文件的路径,你msdn一下
LBJAMS 2013-03-08
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
C/C++ code?12345678910111213141516171819REGEDIT4 [HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}] @="ToDir"[HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C939228……
哥呀,看不明白!!
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
REGEDIT4


[HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}]
   @="ToDir"
[HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}\InProcServer32]
   @="ToDir.dll"
     "ThreadingModel"="Apartment"


[HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\ToDir]
   @="{C7BAB981-03C9-11d4-9127-00A0C9392281}"
[HKEY_CLASSES_ROOT\Directory\shellex\ContextMenuHandlers\ToDir]
   @="{C7BAB981-03C9-11d4-9127-00A0C9392281}"
[HKEY_CLASSES_ROOT\Drive\shellex\ContextMenuHandlers\ToDir]
   @="{C7BAB981-03C9-11d4-9127-00A0C9392281}"

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved]
   "{C7BAB981-03C9-11d4-9127-00A0C9392281}"="ToDir"
LBJAMS 2013-03-08
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
让文件或文件夹能不能看到,参考.rgs文件
这个我还有待验证,是不是按着别人的改成一样的?还有怎么区别选中的是文件还是文件夹?
赵4老师 2013-03-08
  • 打赏
  • 举报
回复
让文件或文件夹能不能看到,参考.rgs文件
赵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-08
  • 打赏
  • 举报
回复
引用 3 楼 miaochunxiang1 的回复:
引用 1 楼 zhao4zhong1 的回复:仅供参考Plain Text code?12345678910111213141516171819REGEDIT4 [HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}] @="ToDir"[HKEY_CLASSES_ROOT\CLSID\{C7B……
Initialize ( LPCITEMIDLIST pidlFolder, LPDATAOBJECT pDataObj, HKEY hProgID ) 应该是这个函数的第三个参数,但是怎么提取出来,有待考察,我不会用windbg调试,都是用write函数写到文件里面去查看的。这个需要类型转换。
LBJAMS 2013-03-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
仅供参考Plain Text code?12345678910111213141516171819REGEDIT4 [HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00A0C9392281}] @="ToDir"[HKEY_CLASSES_ROOT\CLSID\{C7BAB981-03C9-11d4-9127-00……
你贴这些什么意思?看不懂,给些能看懂的吧,这个我已经解决了,我现在问点别的,为什么我添加右击菜单之后点击文件夹能看到添加的菜单,点击文件怎么看不到,还有获取文件或文件夹的名字之后怎么区分是文件还是文件夹,说点能看明白了!!

65,210

社区成员

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

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