我写了一个钩子来hook IFileOperation,但是我这边获取文件数量和文件路径一直只能获得到最后一个并且返回的nCount 也是1


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