Windows 7上的IContextMenu :: InvokeCommand错误代码0x80270000

时间:2013-04-25 05:43:12

标签: c++

我有以下代码来删除该文件。这段代码在winXP上运行正常。但是当我在Windows 7上运行时,它不会删除该文件。执行InvokeCommand语句时,我得到错误代码0x80270000。

HRESULT hr = m_psfCurFolder->GetUIObjectOf(AfxGetMainWnd()->m_hWnd,
    uiCount, 
    (LPCITEMIDLIST*)aPidls, 
    IID_IContextMenu, 
    NULL, 
    (LPVOID*)&pcm);

    if (SUCCEEDED (hr))
    {
        HMENU hPopup = CreatePopupMenu();
        hr = pcm->QueryContextMenu(hPopup, 0, 1, 0x7fff, CMF_NORMAL);

        if (SUCCEEDED (hr))
        {
                CMINVOKECOMMANDINFO cmi;
                cmi.cbSize = sizeof(CMINVOKECOMMANDINFO);
                cmi.fMask =   CMIC_MASK_ASYNCOK;
                cmi.hwnd = (HWND) GetParent();
                cmi.lpVerb = (LPCSTR)(INT_PTR)(ID_MENU_DELETE - 1);
                cmi.lpParameters = NULL;
                cmi.lpDirectory = NULL;
                cmi.nShow = SW_SHOWNORMAL;
                cmi.dwHotKey = 0;
                cmi.hIcon = NULL;

                BOOL bUndoDel = FALSE;
                if (!(GetKeyState(VK_SHIFT) & SHIFTED))
                {
                    bUndoDel = TRUE;
                }
                hr = pcm->InvokeCommand (&cmi);


                if (FAILED(hr))
                {
                    _com_error error(hr);
                    LPCTSTR errorText = error.ErrorMessage();

                    AfxMessageBox(_T("Unable to perform action"));
                }
}

1 个答案:

答案 0 :(得分:1)

我发现了同样的问题,并在Microsoft Visual Studio Language forumMicrosoft Connect发布了详细信息和解决方案。

简而言之,这条线......

    cmi.hwnd = (HWND) GetParent();

......应替换为:

    cmi.hwnd = GetParent()->GetSafeHwnd();

即使将CWnd *转换为HWND会产生相同的数值,但由于某些未知原因,它会在Windows XP(它工作的地方)和Windows 7(它没有)之间产生不同的结果。使用GetSafeHwnd()修复问题,以便现在显示“删除文件”确认对话框。它也适用于Windows XP。