1

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

1 回答 1

1

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

简而言之,这条线...

    cmi.hwnd = (HWND) GetParent();

...应该替换为:

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

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

于 2013-07-16T23:11:40.377 回答