我试图在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!");
}
}
但它永远不会进入内部 有谁知道为什么?
答案 0 :(得分:0)
以下列出了Windows API如何枚举目录中的文件。看here。
[编辑] 在我的第一次参赛时错过了你的问题的意图。您想知道如何在访问iShellFolder时捕获事件?你可能已经Looked Here了?它有一些示例代码,并讨论了我认为可能有用的主题。
答案 1 :(得分:0)
只需更改为
if (IsEqualCLSID(rclsid, (REFGUID) CLSID_ShellFSFolder) )
现在可行了