1

我正在尝试在 Ishellfolder 中挂钩函数 enumobjects 。我这样做是因为我想在资源管理器中显示用户不存在的文件。我成功挂钩 FindNextFile 和 FindFirstFile 但不幸的是,这个函数并不总是由资源管理器根据这个问题在 Windows 7 中由 explorer.exe 使用哪些 API 来列出文件?

现在我尝试挂钩 IShellFolder::EnumObjects 所以我挂钩

MyCoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID riid, LPVOID *ppv)

在这个函数里面我有以下代码:

if (IsEqualCLSID(rclsid, (REFGUID) __uuidof (IShellFolder)) || 
    IsEqualCLSID(rclsid, (REFGUID) __uuidof (IShellFolder2)) ||
    IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellDesktop) ||
    IsEqualCLSID(rclsid, (REFGUID) IID_IShellFolder) )
{

    PDEBUG(L"IID_IShellFolder.2");
    IShellFolderCast *shellFolder = (IShellFolderCast *) *ppv;

    orig_EnumObjects = (type_EnumObjects) GetInterfaceMethod(shellFolder->lpVtbl, 4);
    if (!Mhook_SetHook((void **) &orig_EnumObjects, MyEnumObjects))
    {
        PDEBUG(L". CoCreateInstance. Failed to set EnumObjects!");
    }else
    {
        PDEBUG(L". CoCreateInstance. success to set EnumObjects!");
    }
}

但如果有人知道为什么,它永远不会进入内部?

4

2 回答 2

0

下面列出了 windows API 如何枚举目录中的文件。看这里

[编辑] 在我第一次输入时错过了您的问题的意图。您想知道在访问 iShellFolder 时如何捕获事件吗?您可能已经看过这里?它有一些示例代码,并围绕我认为可能有用的主题进行讨论。

于 2013-08-21T15:23:53.673 回答
0

只需更改为

if (IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellFSFolder) )

现在它可以工作了

于 2013-08-22T15:52:16.600 回答