windows 7上的IContextMenu: InvokeCommand错误码0x80270000

IContextMenu::InvokeCommand error Code 0x80270000 on windows 7

本文关键字:错误 误码 0x80270000 InvokeCommand 上的 IContextMenu windows      更新时间:2023-10-16

我有以下代码来删除文件。这段代码在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"));
                }
}

我发现了同样的问题,并在Microsoft Visual Studio语言论坛和Microsoft Connect上发布了详细信息和解决方案。

简而言之,这一行…

    cmi.hwnd = (HWND) GetParent();

…应该替换为:

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

即使将CWnd*转换为HWND产生相同的数值,但是由于某些未知的原因,它在Windows XP(它工作)和Windows 7(它不工作)之间产生不同的结果。使用GetSafeHwnd()修复了这个问题,现在显示"删除文件"确认对话框。