C++ Windows上下文菜单C++;在选择中使用快捷方式

C++ Windows上下文菜单C++;在选择中使用快捷方式,c++,windows,contextmenu,shortcut,shell-extensions,C++,Windows,Contextmenu,Shortcut,Shell Extensions,当右键单击的目标是快捷方式时,在我的ContextMenu实现中,我很难获得所选文件的列表。全局内存句柄返回一个仅包含快捷方式项的列表,并且似乎不知道我选择的任何其他项 我在许多第三方应用程序中也注意到了这种行为,包括Notepad++、WinRar和UltraEdit 当右键单击的目标是快捷方式时,获取选定文件列表的正确方法是什么?这不是烘焙到资源管理器中的文件压缩功能的问题(右键单击>发送到>压缩压缩文件夹) 编辑:这里是我当前方法的一个小片段pida->cidl变为1,否则它是我选择的正确

当右键单击的目标是快捷方式时,在我的ContextMenu实现中,我很难获得所选文件的列表。全局内存句柄返回一个仅包含快捷方式项的列表,并且似乎不知道我选择的任何其他项

我在许多第三方应用程序中也注意到了这种行为,包括Notepad++、WinRar和UltraEdit


当右键单击的目标是快捷方式时,获取选定文件列表的正确方法是什么?这不是烘焙到资源管理器中的文件压缩功能的问题(右键单击>发送到>压缩压缩文件夹)

编辑:这里是我当前方法的一个小片段<当目标是快捷方式时,代码>pida->cidl变为1,否则它是我选择的正确项数:

CStgMedium me; 
pDataObj->GetData(&fe, &me); 

LPIDA pida = reinterpret_cast<LPIDA>(me.hGlobal); 
for(UINT i = 0; i < pida->cidl; i++) {
    ...
}
CStgMedium-me;
pDataObj->GetData(&fe,&me);
LPIDA pida=重新解释铸造(me.hGlobal);
对于(UINT i=0;icidl;i++){
...
}

我们在这里讨论的是
IContextMenu
界面吗?如果是这样,您应该这样做(可能会出错,我在没有编译器的情况下编写):

Initialize(PCIDLIST_绝对PID文件夹,IDataObject*pdtobj,HKEY hkeyProgID){
FORMATETC fetc={CF_HDROP,null,DVASPECT_CONTENT,-1,TYMED_HGLOBAL};
STGMEDIUM-stgm;
pdtobj->GetData(&fetc,&stgm);
UINT count=DragQueryFile(stgm.hGlobal,0xFFFFFFFF,null,0);
字符文件名[255];

对于(int i=0;iSorry,我指的是
IShellView
,没有拖放任何文件或文件夹。我现在正在进行以下调用:
CStgMedium me;pDataObj->GetData(&fe,&me);LPIDA pida=reinterpret_cast(me.hGlobal);UINT num=pida->cidl;
pida->cidl值正在更改;在上面的场景中,当我右键单击的目标是快捷方式时,该值变为1。如果目标不是快捷方式,它将变为实际选定的项目数。“这不是烘焙到资源管理器中的文件压缩功能的问题”-这并不意味着公众知道如何做。微软倾向于保留一些API仅供其使用。这是真的,我希望这种情况不是这样,希望有人能证实=(有关于您当前正在做什么的提示吗?关于您如何尝试进入所选项目列表的代码片段?我希望有一种记录在案的方法可以做到这一点(您现在使用),如果它不起作用,那么我们就在荒野中——只有内部的、未记录的方式才能起作用。这几乎是我在第一篇评论中发布的片段,我已经将其添加到原始帖子中。您实现了哪些接口?
Initialize(PCIDLIST_ABSOLUTE pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID){

    FORMATETC fetc = { CF_HDROP, null, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stgm;

    pdtobj->GetData(&fetc, &stgm);
    UINT count = DragQueryFile(stgm.hGlobal, 0xFFFFFFFF, null, 0);
    char filename[255];

    for (int i=0; i<count; i++){
        DragQueryFile(stgm.hGlobal, i, filename, 255);
        // Here do something with i-th filename
    }
}