UINT GetFilesFromDataObjectWin(
IUnknown* iUnknown,
LPWSTR** ppPath)
{
HRESULT hr = E_FAIL;
LPITEMIDLIST Pv = NULL;
int nCount = 0;
IShellItemArray* ShellItemArray = NULL;
do
{
__try
{
hr = SHGetIDListFromObject(iUnknown, &Pv);
if (FAILED(hr))
{
break;
}
hr = SHCreateShellItemArrayFromIDLists(
TRUE,
(LPCITEMIDLIST*)&Pv,
&ShellItemArray);
if (FAILED(hr))
{
break;
}
hr = ShellItemArray->GetCount((ULONG*)&nCount);
if (!nCount)
{
break;
}
WriteLog("nCount %d", nCount);
*ppPath = new LPWSTR[nCount];
memset(*ppPath, 0, sizeof(LPWSTR) * nCount);
for (int Index = 0; Index < nCount; Index++)
{
IShellItem* ShellItem = NULL;
if (SUCCEEDED(ShellItemArray->GetItemAt(
Index,
&ShellItem)))
{
if (ShellItem /*&& ShellItem->GetAttributes(
0x20000000,
&GAof ) == 0 */)
{
LPWSTR Temp = NULL;
if (SUCCEEDED(ShellItem->GetDisplayName(
SIGDN_FILESYSPATH,
&Temp)))
{
__try
{
if (Temp)
{
int Length = wcslen(Temp);
*ppPath[Index] = new WCHAR[Length + 1];
memset(*ppPath[Index], 0, sizeof(WCHAR) * (Length + 1));
wcsncpy(
*ppPath[Index],
Temp,
Length);
CoTaskMemFree(Temp);
Temp = NULL;
}
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
if (Temp)
{
CoTaskMemFree(Temp);
Temp = NULL;
}
}
}
}
if (ShellItem)
{
ShellItem->Release();
}
}
}
}
__finally
{
if (ShellItemArray)
{
ShellItemArray->Release();
}
if (Pv)
{
CoTaskMemFree(Pv);
}
}
} while (FALSE);
WriteLog("nCount %d", nCount);
return nCount;
}
static HRESULT __stdcall CopyItems_new(IFileOperation* pThis,
IUnknown* punkItems,
IShellItem* psiDestinationFolder)
{
WriteLog("CopyItems_new执行");
LPWSTR lpDst = NULL;
psiDestinationFolder->GetDisplayName(SIGDN_FILESYSPATH, &lpDst);
HRESULT hr = S_FALSE;
PFileOPItem pfoi = GetOPItem();
//我在这里调用返回的文件数量始终是1
pfoi->srcCount = GetFilesFromDataObjectWin(punkItems, &(pfoi->srcList));
do
{
if (MyCopyMove_items(punkItems, lpDst, pfoi)) {
hr = CopyItems_old(pThis, punkItems, psiDestinationFolder);
}
} while (FALSE);
FreeOPItem();
CoTaskMemFree(lpDst);
return hr;
}
我写了一个钩子来hook IFileOperation,但是我这边获取文件数量和文件路径一直只能获得到最后一个并且返回的nCount 也是1
将WriteLog改为sprintf+DebugOutputStringA