Hook ishellfolder enumobjects

时间:2013-08-21 15:05:53

标签: c++ c windows winapi windows-explorer

我试图在Ishellfolder中挂钩函数enumobjects。 我这样做是因为我想在资源管理器中显示用户不存在的文件。 我成功地连接了FindNextFile和FindFirstFile,但不幸的是,这个函数并不总是由资源管理器根据这个问题调用Which APIs are used by explorer.exe in Windows 7 to list files?

现在我尝试挂钩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!");
    }
}

但它永远不会进入内部 有谁知道为什么?

2 个答案:

答案 0 :(得分:0)

以下列出了Windows API如何枚举目录中的文件。看here

[编辑] 在我的第一次参赛时错过了你的问题的意图。您想知道如何在访问iShellFolder时捕获事件?你可能已经Looked Here了?它有一些示例代码,并讨论了我认为可能有用的主题。

答案 1 :(得分:0)

只需更改为

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

现在可行了