Windows 10中的跳转列表失败

时间:2015-09-06 22:51:34

标签: c++ winapi visual-studio-2015

我正在使用以下代码让任务栏跳转列表在某些页面上打开用户默认浏览器。

现在Win 7/8上的所有功能都运行了大约一年,但是在使用Windows 10时,单击任务栏任务时不会调用浏览器,并且Microsoft文档显示Win 8到10之间没有任何更改。

 bool SetUpJumpList( )
 {
    HRESULT hr;
    CComPtr<ICustomDestinationList> pDestList;
    hr = pDestList.CoCreateInstance ( CLSID_DestinationList , NULL , CLSCTX_INPROC_SERVER );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pDestList->SetAppID ( _TBID );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    UINT cMaxSlots;
    CComPtr<IObjectArray> pRemovedItems;
    hr = pDestList->BeginList ( &cMaxSlots , IID_PPV_ARGS ( &pRemovedItems ) );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    CComPtr<IObjectCollection> pObjColl;
    hr = pObjColl.CoCreateInstance ( CLSID_EnumerableObjectCollection , NULL , CLSCTX_INPROC_SERVER );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    if ( !AddJumpListTasks ( pObjColl ) )
    {
            return false;
    }
    CComQIPtr<IObjectArray> pTasksArray = pObjColl;
    if ( !pTasksArray )
    {
            return false;
    }
    hr = pDestList->AddUserTasks ( pTasksArray );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pDestList->CommitList( );
    return SUCCEEDED ( hr );
 }

 bool AddJumpListTasks ( IObjectCollection* pObjColl )
 {
    wchar_t pBuf[ MAX_PATH ];
    int bytes = GetModuleFileName ( NULL , pBuf , MAX_PATH );
    CJumpListTask aTasks[ ] =
    {
            { _T ( "https://www.google.co.uk" ) , _T ( "Home Page" ) , _T ( "Home" ) , 0 },
            { _T ( "https://www.google.co.uk" ) , _T ( "Twitter Page" ) , _T ( "Twitter" ) , 9 },
            { _T ( "https://www.google.co.uk" ) , _T ( "Facebook Page" ) , _T ( "Facebook" ) , 10 }
    };
    CString strBrowser;
    DWORD size = 1024;
    AssocQueryString ( 0 , ASSOCSTR_EXECUTABLE , L"http" , L"Open" , strBrowser.GetBufferSetLength ( size ) , &size );
    for ( int i = 0; i < _countof ( aTasks ); i++ )
    {
            if ( !AddJumpListTask ( pObjColl , aTasks[ i ] , strBrowser , pBuf ) )
            {
                    strBrowser.ReleaseBuffer( );
                    return false;
            }
    }
    strBrowser.ReleaseBuffer( );
    return true;
 }

 bool AddJumpListTask ( IObjectCollection* pObjColl , const CJumpListTask& rTask , LPCTSTR szExePath , LPCTSTR pBuf )
 {
    HRESULT hr;
    CComPtr<IShellLink> pLink;
    hr = pLink.CoCreateInstance ( CLSID_ShellLink , NULL , CLSCTX_INPROC_SERVER );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pLink->SetPath ( szExePath );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pLink->SetArguments ( rTask.szArgs );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pLink->SetIconLocation ( pBuf , rTask.nIconIndex );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    CComQIPtr<IPropertyStore> pPropStore = pLink;
    PROPVARIANT pv;
    if ( !pPropStore )
    {
            return false;
    }
    hr = InitPropVariantFromString ( CT2CW ( rTask.szTitle ) , &pv );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pPropStore->SetValue ( PKEY_Title , pv );
    PropVariantClear ( &pv );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pPropStore->Commit( );
    if ( FAILED ( hr ) )
    {
            return false;
    }
    hr = pObjColl->AddObject ( pLink );
    return SUCCEEDED ( hr );
 }

我注意到其他一些应用程序,例如CCleaner也使用此方法也不起作用,但Office 2013等Microsoft应用程序仍然有效,所以问题是如何在Windows 10上再次运行?

我确定这与存储在CustomDestinations文件夹中的 customDestinations-ms 文件无关,因为Windows 10的全新安装会出现相同的非功能。

使用所需的文本和图标创建任务栏任务菜单,调试显示正确的URL以及正确的默认浏览器和浏览器路径。

修改

将Visual Studio 2015与工具集Windows XP v140_xp一起使用

2 个答案:

答案 0 :(得分:1)

作为一种解决方法,如果可能,您可以使用最新Windows SDK中的MFC类“CJumplist”。

我们发现它可以解决此问题,但仅限于使用最新的SDK版本。使用相同MFC类(例如Windows 7 SDK)的较旧SDK会导致您遇到的问题完全相同。

这是使用VC2013和最新SDK(Target v12.0)在Windows 10上运行的示例代码,但仅限在共享Dll中使用MFC时。与静态MFC Dll链接似乎不起作用。

CJumpList *pJumpList = new CJumpList();
pJumpList->SetAppID(m_pszAppID);
result = pJumpList->AddTask(szPath, _T("-data1"), _T("number 4"), szPath, 0);
result = pJumpList->AddTask(szPath, _T("-data2"), _T("number 5"), szPath, 0);
pJumpList->CommitList();
delete pJumpList;

我不知道Microsoft开发人员在此类中做了哪些更改才能使其正常工作。我们的纯Win32代码遇到了与您报告的问题相同的问题。

答案 1 :(得分:0)

对此进行了一点更新,由于其他问题重新安装Windows,然后重新安装VS但未检查XP兼容性选项导致Jumplists再次运行,我无论如何都不需要XP支持但是我认为这个问题是相关的到XP库。