SHDocVw :: IShellWindowsPtr не работает с IE8? (Ошибка 0x80040154)

Моя программа является DLL, которая подключается к работающему экземпляру IE. Это работало хорошо в течение многих лет.

Недавно я отряхнул его и запустил, но последняя строка ниже не hr = 0x80040154:

#import <mshtml.tlb>     rename("value", "theValue") rename("event", "theEvent")
#import <shdocvw.dll>

// ....

SHDocVw::IShellWindowsPtr spSHWinds;
HRESULT hr = m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows));

Может ли это иметь значение, что IE7 был заменен IE8? Где еще мне посмотреть?

Я использую VS2008, если это имеет значение.

Отредактировано, чтобы добавить

Я не вижу, что это может быть проблема 32/64 бит — в прошлом году она работала нормально на этой же машине. Единственное, что изменилось (насколько я заметил), это версия IE, с 7 до 8.

Примечание для охотников за головами:

У меня есть доступ к этой системе только в течение нескольких часов в день (около 0:00 EST), поэтому вы можете не получить быстрых ответов на ваши предложения, но я будут посмотри на них.

Если вы думаете, что есть вещи, которые я должен проверять (например, значения реестра), будьте конкретны.

Отредактировано, чтобы добавить:

Теперь я вижу, что первый Когда я вызываю CreateInstance, он возвращает 0x80070002, а не 0x80040154.

1

Решение

Это будет очень трудно диагностировать. ShellWindows coclass является особенным, его ключ реестра CLSID HKEY_CLASSES_ROOT\CLSID\{9BA05972-F6A8-11CF-A442-00A0C90A8F39}, Когда вы посмотрите туда, вы не увидите ничего полезного зарегистрированного там. Исходная история заключается в том, что это пережиток неудачной попытки сделать оболочку Windows похожей на веб-браузер. Все еще видимый сегодня, перечисление окон оболочки возвращает экземпляры Windows Explorer и Internet Explorer.

Утилита SysInternals ProcMon почти всегда является предпочтительным оружием для отладки ошибок 0x80040154, но здесь она не работает. Вы можете видеть, как он проверяет реестр и не находит то, что ищет, но тогда программа знает, как загрузить ieframe.dll. Это может работать только операционной системой, перехватывающей вызов CoCreateInstance (). Что в общем имеет смысл, учитывая, что в Coclass перечисляются оболочки Windows.

Все, что у вас осталось, это метод проб и ошибок. Сначала переустановите IE, затем ОС. Или вытолкнуть машину из окна 4-го этажа, пока она не съела слишком много вашего драгоценного времени.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector