Windows 11: iinitializewithfile :: инициализировать несколько раз, вызывая сбой проводника файлов (отлично работает в WiC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Windows 11: iinitializewithfile :: инициализировать несколько раз, вызывая сбой проводника файлов (отлично работает в Wi

Сообщение Anonymous »

Я разрабатываю расширение оболочки Windows, которое взаимодействует с панелью предварительного просмотра файлов. Цель состоит в том, чтобы заблокировать предварительные просмотра файлов при определенных условиях для файлов в синхронизированной папке (например, от облачного провайдера). Для этого я зацепил API CocreateInstance и предварительные компоненты предварительного просмотра, такие как ipreviewhandler и iinitializewithfile. Если предварительный просмотр разрешено, мы называем исходный метод инициализации.
ожидаемое поведение (Windows 10):

[*] Метод инициализации называется один раз на клик (от Shell32.dll).
[*] После принятия решений в нашем методике настройка, превью работает как ожидалось, без ожидания. /> < /ul>
Проблема в Windows 11: < /strong> < /p>

Наш метод инициализации инициализации называется несколько раз из различных модулей, таких как Shell32.dll, Combase.dll и т. Д. Проблема не возникает в Windows 10 с одной и той же логикой. < /li>
< /ul>
Что я пробовал до сих пор: < /strong> < /p>
  • vtable dectrating < /strong>:

    после вызова оригинального инициализации, я возвращаю к выходу на основу. Это предотвращает сбою, но не останавливает наш метод, который был вызван при последующих кликах файлов. Окружающая среда: < /strong>

    Windows 11 23h2 < /li>
    Explorer Windows с включенной панелью предварительного просмотра < /li>
    Cocreateinstance с использованием Minhook v1.3.4 < /li>
    < /ul>

    < /ol>

    < /ol>

    < /ol>
    < /ul>

    < /ol> < /ol> < /br /> < /ul>

    < /li>
    < /ul>
    code: < /strong> < /p>
    // Hooked CoCreateInstance
    HRESULT Hooked_CoCreateInstance(...) {
    if (riid == IID_IPreviewHandler) {
    auto pInit = GetInitializeWithFile(instance);
    if (pInit) {
    SaveOriginalMethod(pInit);
    OverwriteVTable(pInit, &CustomInitialize);
    }
    }
    return Original_CoCreateInstance(...);
    }

    HRESULT CustomInitialize(LPCWSTR filepath, ...) {
    if (CanAllowPreview(filepath)) {
    RestoreOriginalVTable(); // Attempt to stop recursive calls
    return OriginalInitialize(filepath);
    } else {
    return E_ACCESSDENIED;
    }
    }
    < /code>
    Вопросы < /strong>: < /p>

    Почему iinitializewithfile :: инициализируется, что можно неоднократно в Windows 11, но не в Windows 10? Есть более надежный и поддерживаемый метод для предотвращения предварительных просмотров файлов на основе пользовательской логики без сбоя исследователя?


Подробнее здесь: https://stackoverflow.com/questions/795 ... ing-file-e
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»