从命令行管理程序运行/帮助(MFC C++)创建数据对象



我需要帮助来创建 IDataObject 以启用这两个项目的拖放(运行和帮助)例如,我需要像Windows开始菜单一样做。

为了运行它们,我使用这些

CComPtr<IShellDispatch2> pShellDisp;
if (SUCCEEDED(CoCreateInstance(CLSID_Shell,NULL,CLSCTX_SERVER,IID_IShellDispatch2,(void**)&pShellDisp)))
{
    pShellDisp->Help();    //Help
    pShellDisp->FileRun(); //Run
}

你们能帮我吗?

PS:我也需要带有图像图标的拖动

编辑 [已解决]

IShellFolder* desk = NULL;
                HRESULT hr =SHGetDesktopFolder(&desk);
                LPITEMIDLIST pidl2=NULL;
                ULONG cbEaten;
                DWORD dwAttribs = 0 ;
                hr = desk->ParseDisplayName(NULL,
                                             NULL,
                                             L"shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0}",
                                             &cbEaten,  // This can be NULL
                                             &pidl2,
                                             &dwAttribs);
                hr = desk->GetUIObjectOf(parentHwnd, 1,
                        (PCITEMID_CHILD*)&pidl2, IID_IDataObject, 0, (LPVOID *)lpdataObj);
                desk->Release();
                return;

对于运行:

shell:::{2559a1f3-21d7-11d4-bdaf-00c04f60b9f0} 

我假设您只需要在任何时间点在数据对象中出现这些项目之一,在这种情况下:

  • 如果您已经有一个 IShellItem,那么您可以调用 IShellItem::BindToHandler(...,BHID_DataObject,...)
  • 如果你只有pidl,你可以使用SHCreateDataObject或CIDLData_CreateFromIDArray

如果您想在同一操作中拖放两个项目,那么事情就会变得困难。我不知道这两个对象是否具有相同的父对象。如果他们这样做,那么即使是旧的CIDLData_CreateFromIDArray也可以处理它。如果他们不这样做,那么你可以尝试SHCreateShellItemArrayFromIDLists,然后使用IShellItemArray::BindToHandler(...,BHID_DataObject,...)。为了支持<Vista,我相信您必须创建自己的CFSTR_SHELLIDLIST并将其添加到数据对象中。>

拖动图像与此无关,应该在一个单独的问题中提出,其中包含有关IDragSourceHelper等的信息。

相关内容

  • 没有找到相关文章

最新更新