explorer 左边一栏与右边一栏有什么区别在explorer 右边 选择文件正常工作,而在选择左边的文件夹时出理错误。
错误地方为:
hr = pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*)&pIDataObject);
if(FAILED(hr) || pIDataObject == NULL)//选择左边的文件夹时进入此语句 {
DoLog(_T("pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*)&pIDataObject) failed."));
break;

完整代码:
void CBandToolBarCtrl::OnGetSelectedFiles()
{
IShellView  * pIShellView = NULL;
LPMALLOC pMalloc = NULL;
IDataObject* pIDataObject = NULL;
FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
STGMEDIUM stgmedium = {TYMED_HGLOBAL};
HWND hwndFind = GetForegroundWindow();
LPITEMIDLIST pidlFull = NULL;
IShellWindows *psw;
HRESULT hr;
TCHAR szFile[MAX_PATH];
HDROP hdrop = NULL;
HRESULT hRes = NULL; DoLog(_T("Enter CBandToolBarCtrl::OnGetSelectedFiles()"));
m_lsFiles.clear();
DoLog(_T("CoInitializeEx()"));
hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (hRes == RPC_E_CHANGED_MODE) {
DoLog(_T("CoInitializeEx() return RPC_E_CHANGED_MODE"));
}
else if (hRes == S_FALSE) {
DoLog(_T("CoInitializeEx() return S_FALSE"));
::CoUninitialize();
hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
}
else {
DoLog(_T("CoInitializeEx() return S_OK"));
} DoLog(_T("CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw)"));
hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw);
if (SUCCEEDED(hr)) {
VARIANT v;
V_VT(&v) = VT_I4;
IDispatch  *pdisp;
BOOL fFound = FALSE;
if (psw->Item(v, &pdisp) != S_OK) {
DoLog(_T("psw->Item(v, &pdisp) != S_OK"));
}
for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK; V_I4(&v)++) 
{
IWebBrowserApp *pwba;
if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) 
{
HWND hwndWBA;
if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) && hwndWBA == hwndFind) 
{
fFound = TRUE;
IServiceProvider *psp;
if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) 
{
IShellBrowser *psb;
if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,IID_IShellBrowser, (void**)&psb))) 
{
do{
DoLog(_T("Enter do loop."));
hr = psb->QueryActiveShellView(&pIShellView);
if(FAILED(hr)){
DoLog(_T("psb->QueryActiveShellView(&pIShellView); failed."));
break;
}
else 
{

}

hr = ::SHGetMalloc(&pMalloc); //Get pointer to shell alloc
if(FAILED(hr))
{
DoLog(_T("::SHGetMalloc(&pMalloc) failed."));
break;
}
else 
{

} hr = pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*)&pIDataObject);
if(FAILED(hr) || pIDataObject == NULL) 
{
DoLog(_T("pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*)&pIDataObject) failed."));
break;
}
else 
{

}
hr = pIDataObject->GetData(&fmte,&stgmedium);
if(FAILED(hr))
{
DoLog(_T("pIDataObject->GetData(&fmte,&stgmedium) failed."));
break;
}
else 
{

}
hdrop = (HDROP)GlobalLock(stgmedium.hGlobal);
if ( NULL == hdrop ) 
{
ReleaseStgMedium(&stgmedium);
DoLog(_T("(HDROP)GlobalLock(stgmedium.hGlobal) failed."));
return;
}
else 
{

} UINT uNumFiles = DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0 );
TCHAR cctemp[100] = {_T("0")};
_stprintf(cctemp, _T("Selected number of files = %d"), uNumFiles);
DoLog(cctemp);
for(UINT uFile = 0; uFile < uNumFiles; uFile++)
{
if(0 == DragQueryFileW( hdrop, uFile, szFile, MAX_PATH)) 
{
continue;
}
m_lsFiles.push_back(szFile);

}while(FALSE);
//Clean up
GlobalUnlock(stgmedium.hGlobal);
ReleaseStgMedium(&stgmedium);
if(pIDataObject)
pIDataObject->Release();
if(pIShellView)
pIShellView->Release();
if(pMalloc){
if(pidlFull)
pMalloc->Free(pidlFull);
pMalloc->Release();
}
psb->Release();
}
else 
{
DoLog(_T("pwba->QueryInterface(IID_IServiceProvider, (void**)&psp) failed."));
}
psp->Release();
}
else
{
DoLog(_T("pwba->QueryInterface(IID_IServiceProvider, (void**)&psp) failed."));
}
}
else 
{
DoLog(_T("pwba->get_HWND((LONG_PTR*)&hwndWBA)) && hwndWBA == hwndFind is false."));
}
pwba->Release();
}
else 
{
DoLog(_T("pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba) failed."));
}
pdisp->Release();
}
psw->Release();
}
else 
{
DoLog(_T("CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw) failed."));
}
if (hRes != RPC_E_CHANGED_MODE) {
::CoUninitialize();
}} }

解决方案 »

  1.   

    在explorer 右边 选择文件夹能正常取得所选取的文件夹路径,而在选择左边的文件夹时不能正确取得文件夹的路径,求高手帮忙完整代码:
    void CBandToolBarCtrl::OnGetSelectedFiles()
    {
    IShellView  * pIShellView = NULL;
    LPMALLOC pMalloc = NULL;
    IDataObject* pIDataObject = NULL;
    FORMATETC fmte = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
    STGMEDIUM stgmedium = {TYMED_HGLOBAL};
    HWND hwndFind = GetForegroundWindow();
    LPITEMIDLIST pidlFull = NULL;
    IShellWindows *psw;
    HRESULT hr;
    TCHAR szFile[MAX_PATH];
    HDROP hdrop = NULL;
    HRESULT hRes = NULL;DoLog(_T("Enter CBandToolBarCtrl::OnGetSelectedFiles()"));
    m_lsFiles.clear();
    DoLog(_T("CoInitializeEx()"));
    hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    if (hRes == RPC_E_CHANGED_MODE) {
    DoLog(_T("CoInitializeEx() return RPC_E_CHANGED_MODE"));
    }
    else if (hRes == S_FALSE) {
    DoLog(_T("CoInitializeEx() return S_FALSE"));
    ::CoUninitialize();
    hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
    }
    else {
    DoLog(_T("CoInitializeEx() return S_OK"));
    }DoLog(_T("CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw)"));
    hr = CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw);
    if (SUCCEEDED(hr)) {
    VARIANT v;
    V_VT(&v) = VT_I4;
    IDispatch  *pdisp;
    BOOL fFound = FALSE;
    if (psw->Item(v, &pdisp) != S_OK) {
    DoLog(_T("psw->Item(v, &pdisp) != S_OK"));
    }
    for (V_I4(&v) = 0; !fFound && psw->Item(v, &pdisp) == S_OK; V_I4(&v)++) 
    {
    IWebBrowserApp *pwba;
    if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba))) 
    {
    HWND hwndWBA;
    if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA)) && hwndWBA == hwndFind) 
    {
    fFound = TRUE;
    IServiceProvider *psp;
    if (SUCCEEDED(pwba->QueryInterface(IID_IServiceProvider, (void**)&psp))) 
    {
    IShellBrowser *psb;
    if (SUCCEEDED(psp->QueryService(SID_STopLevelBrowser,IID_IShellBrowser, (void**)&psb))) 
    {
    do{
    DoLog(_T("Enter do loop."));
    hr = psb->QueryActiveShellView(&pIShellView);
    if(FAILED(hr)){
    DoLog(_T("psb->QueryActiveShellView(&pIShellView); failed."));
    break;
    }
    else 
    {

    }

    hr = ::SHGetMalloc(&pMalloc); //Get pointer to shell alloc
    if(FAILED(hr))
    {
    DoLog(_T("::SHGetMalloc(&pMalloc) failed."));
    break;
    }
    else 
    {

    } hr = pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*)&pIDataObject);
    if(FAILED(hr) || pIDataObject == NULL) 
    {
    DoLog(_T("pIShellView->GetItemObject(SVGIO_SELECTION, IID_IDataObject, (LPVOID*)&pIDataObject) failed."));
    break;
    }
    else 
    {

    }
    hr = pIDataObject->GetData(&fmte,&stgmedium);
    if(FAILED(hr))
    {
    DoLog(_T("pIDataObject->GetData(&fmte,&stgmedium) failed."));
    break;
    }
    else 
    {

    }
    hdrop = (HDROP)GlobalLock(stgmedium.hGlobal);
    if ( NULL == hdrop ) 
    {
    ReleaseStgMedium(&stgmedium);
    DoLog(_T("(HDROP)GlobalLock(stgmedium.hGlobal)  failed."));
    return;
    }
    else 
    {

    } UINT uNumFiles = DragQueryFile(hdrop, 0xFFFFFFFF, NULL, 0 );
    TCHAR cctemp[100] = {_T("0")};
    _stprintf(cctemp, _T("Selected number of files = %d"), uNumFiles);
    DoLog(cctemp);
    for(UINT uFile = 0; uFile < uNumFiles; uFile++)
    {
    if(0 == DragQueryFileW( hdrop, uFile, szFile, MAX_PATH)) 
    {
    continue;
    }
    m_lsFiles.push_back(szFile);

    }while(FALSE);
    //Clean up
    GlobalUnlock(stgmedium.hGlobal);
    ReleaseStgMedium(&stgmedium);
    if(pIDataObject)
    pIDataObject->Release();
    if(pIShellView)
    pIShellView->Release();
    if(pMalloc){
    if(pidlFull)
    pMalloc->Free(pidlFull);
    pMalloc->Release();
    }
    psb->Release();
    }
    else 
    {
    DoLog(_T("pwba->QueryInterface(IID_IServiceProvider, (void**)&psp) failed."));
    }
    psp->Release();
    }
    else
    {
    DoLog(_T("pwba->QueryInterface(IID_IServiceProvider, (void**)&psp) failed."));
    }
    }
    else 
    {
    DoLog(_T("pwba->get_HWND((LONG_PTR*)&hwndWBA)) && hwndWBA == hwndFind is false."));
    }
    pwba->Release();
    }
    else 
    {
    DoLog(_T("pdisp->QueryInterface(IID_IWebBrowserApp, (void**)&pwba) failed."));
    }
    pdisp->Release();
    }
    psw->Release();
    }
    else 
    {
    DoLog(_T("CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,IID_IShellWindows, (void**)&psw) failed."));
    }
    if (hRes != RPC_E_CHANGED_MODE) {
    ::CoUninitialize();
    }}