Перехват перечисляемых объектов ishellfolder

Я пытаюсь подключить функцию enumobjects в Ishellfolder. Я делаю это, потому что хочу отображать пользователю несуществующие файлы в проводнике. Мне удалось подключить FindNextFile и FindFirstFile, но, к сожалению, эта функция не всегда вызывается проводником в соответствии с этим вопросом exe-in-windows-7-to-list-files">Какие API используются программой explorer.exe в Windows 7 для вывода списка файлов?

Теперь я пытаюсь перехватить 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!");
    }
}

но это никогда не входит внутрь, если кто-нибудь знает, почему?


person Beno    schedule 21.08.2013    source источник


Ответы (2)


Ниже показано, как Windows API перечисляет файлы в каталоге. Посмотрите здесь.

[EDIT] Пропустил цель вашего вопроса в моей первой записи. Вы хотите знать, как перехватить событие при доступе к iShellFolder? Вероятно, вы уже просматривали здесь? В нем есть пример кода и обсуждаются темы, которые, по моему мнению, могут быть полезны.

person ryyker    schedule 21.08.2013
comment
Мне писали, что я уже цепляю FindFirstFile (FindFirstFileEx)/FindNextFile/FindClose. Я не хочу их использовать! Я хочу их зацепить. и в Windows 7 проводник Windows больше не использует их при каждом переходе к определенному каталогу - person Beno; 21.08.2013
comment
Я не хочу ловить события. Я хочу заменить значение, возвращаемое enumObjects - person Beno; 21.08.2013

Просто измените на

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

и теперь это работает

person Beno    schedule 22.08.2013