我有以下代码来删除该文件。这段代码在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"));
}
}
答案 0 :(得分:1)
我发现了同样的问题,并在Microsoft Visual Studio Language forum和Microsoft Connect发布了详细信息和解决方案。
简而言之,这条线......
cmi.hwnd = (HWND) GetParent();
......应替换为:
cmi.hwnd = GetParent()->GetSafeHwnd();
即使将CWnd *转换为HWND会产生相同的数值,但由于某些未知原因,它会在Windows XP(它工作的地方)和Windows 7(它没有)之间产生不同的结果。使用GetSafeHwnd()修复问题,以便现在显示“删除文件”确认对话框。它也适用于Windows XP。