IE BHO в EPM (расширенный защищенный режим)

Я пытаюсь заставить мой IE BHO работать на Win8 (предварительный просмотр IE10 и IE11) с включенным EPM. Я нашел несколько статей на эту тему от MS (http://blogs.msdn.com/b/ieinternals/archive/2012/03/23/understanding-ie10-enhanced-protected-mode-network-security-addons-cookies-metro-desktop.aspx), но они по-прежнему не предоставляют реальных примеров того, как это сделать. Я скомпилировал свой BHO как в 32-битной, так и в 64-битной версии, добавил категорию (CATID_AppContainerCompatible), как указано в статье, но по-прежнему не получаю никаких событий веб-браузера от IE. Может ли кто-нибудь указать более подробный пример того, как сделать эту работу?

Вот как выглядит мой файл rgs:


HKCR
{
    TestBHO.TestScript.1 = s 'TestScript Class'
    {
        CLSID = s '{051FB9EC-79EA-4F8E-9EC2-F1FF4462FB09}'
    }
    TestBHO.TestScript = s 'TestScript Class'
    {
        CLSID = s '{051FB9EC-79EA-4F8E-9EC2-F1FF4462FB09}'
        CurVer = s 'TestBHO.TestScript.1'
    }
    NoRemove CLSID
    {
        ForceRemove {051FB9EC-79EA-4F8E-9EC2-F1FF4462FB09} = s 'TestScript Class'
        {
            ProgID = s 'TestBHO.TestScript.1'
            VersionIndependentProgID = s 'TestBHO.TestScript'
            ForceRemove 'Programmable'
            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }
            'TypeLib' = s '{2D9CE0FA-2040-4A24-807E-0C0BF4E9ECE7}'
            'Implemented Categories' = s ''
            {
                {59fb2056-d625-48d0-a944-1a85b5ab2640} = s ''   
                    {
                    }
            }
        }
    }
}

Обратите внимание, что на странице управления надстройками IE я вижу, что мой BHO включен и поддерживает как 32-разрядные, так и 64-разрядные версии, но DLL даже не загружается.


person Shaish    schedule 10.07.2013    source источник
comment
Во-первых, пробовали ли вы отключить EPM, чтобы убедиться, что вы получаете ожидаемый контент, когда EPM не включен? Во-вторых, показывает ли менеджер надстроек IE, что надстройка загружается? В-третьих, как именно вы следите за тем, получает ли ваше дополнение события?   -  person EricLaw    schedule 10.07.2013
comment
1. Да, BHO ведет себя должным образом при отключении EPM. 2. Согласно Add-on Manager статус Enabled и BHO 32 И 64 бит. 3. Я добавил два окна сообщений, чтобы сообщить мне, что я получаю ожидаемые события. Один при вызове SetSite, а другой при вызове DISPID_DOCUMENTCOMPLETE. Опять же, оба события вызываются, как и ожидалось, когда EPM НЕ включен.   -  person Shaish    schedule 11.07.2013


Ответы (1)


Вызов DEFINE_GUID просто определяет константу значения GUID в вашем коде, фактически ничего не делая для регистрации вашего объекта в категории компонентов COM (которая хранится в реестре).

См. http://msdn.microsoft.com/en-us/library/windows/desktop/ms692551(v=vs.85).aspx и http://msdn.microsoft.com/en-us/library/windows/desktop/ms694322(v=vs.85).aspx

Вы можете увидеть, какие объекты зарегистрированы в различных категориях, используя инструмент OLEView.

Кроме того, обязательно поместите DLL вашего BHO в папку, доступную для чтения AppContainer (например, в подпапку папки \Program Files\). Если вы этого не сделаете, ваша DLL не будет загружена экземпляром IE в расширенном защищенном режиме.

person EricLaw    schedule 12.07.2013
comment
Да, я понимаю, что я должен зарегистрировать свой объект в этой категории. См. мой исходный вопрос о том, как выглядит мой файл rgs. Может я неправильно это понял? (Я никогда не работал с категориями COM-компонентов). Также я убедился, что мой BHO находится в папке LocalLow. Это было вашим намерением? И еще вопрос, есть ли причина, по которой ATL не будет работать с этим ? - person Shaish; 15.07.2013
comment
Как я сказал в электронном письме, ваша DLL отлично работает, когда она помещена в папку Program Files. - person EricLaw; 16.07.2013
comment
@Shaish Ты решил свою проблему? Добавление реализованных категорий, как вы сделали, и размещение моих DLL в подпапке Program Files сработало для меня. - person pyrho; 20.09.2013
comment
@pyrho Да, кажется, работает. Не совсем уверен, откуда берется ограничение на размещение DLL в Program Files, но неважно... Спасибо. - person Shaish; 22.09.2013
comment
Ограничение простое: AppContainers могут читать только те пути файловой системы, которые определены ACL, чтобы позволить AppContainers получить к ним доступ. Процесс содержимого IE не может загрузить вашу DLL, если она не находится на пути, на доступ к которому у нее есть разрешение. - person EricLaw; 23.09.2013
comment
@EricLaw, так что любые другие зависимости, связанные с моим BHO, также должны быть в Program Files (например, Qt DLL или boost)? Но стандартные библиотеки, такие как OLE32.dll или KERNEL32.dll, могут оставаться в папке System32? (Кроме того, спасибо за такую ​​(единственную) помощь по вопросам EPM во всем Интернете...) - person pyrho; 23.09.2013
comment
Сотрите мой предыдущий комментарий... Размещение ваших DLL в System32/SysWOW64 тоже работает. - person pyrho; 23.09.2013