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();
}} }
错误地方为:
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();
}} }
解决方案 »
- 我用vc和sql server做了一个查询对话框,编译连接都通过了,运行也出现对话框,但查询时对话框标题上提示“没有响应”。
- VC编写的上位机通过2个串口链接两个设备——在线等
- 加密狗遗失的案例
- --------->>为什么这样不出错啊??
- 请问LINK : fatal error LNK1104: cannot open file "Debug/sockclient.exe"该怎么解决
- 请教高手:小弟最近想安装VC6.0,装不起来..
- 怎样同时捕获Ctrl 和 Enter按键事件
- 关于sendMessage的问题
- 我想问一个简单的问题请进来看看
- 求教:要用cfile类需要include什么?
- 关于信号采集的困惑
- 求教关于霍尼维尔北京,顺便散50分
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();
}}