Класс IImgCtx даже не зарегистрирован в системе. И скорее всего, не реализован. Ошибка возникает при открытии документа в разделе "Панорама (тайм-лайн)". Находится в "Учитель"-"Индивидуальный портфель"-"Рабочие материалы"-"Панорама (тайм-лайн)"
Если ещё не известно... Способ 3 (IImgCtx) Не так давно Майкрософт предоставила заголовочные и библиотечные файлы к объекту ImgCtx, появившемуся еще в Internet Explorer 4.0. Он умеет заргужать картинки в формате BMP, GIF, JPEG, ICO, WMF, EMF, PNG, XBM, ICO, TIFF и, возможно, некоторых других: http://www.rsdn.ru/article/qna/gdi/drawimg.xml ;)
И всё-таки CLSID есть в реестре и должен содержаться в mshtml.dll [Software\\Classes\\CLSID\\{3050F3D6-98B5-11CF-BB82-00AA00BDCE0B}] 1210780353 @="IImgCtx" Тем не менее: fixme:mshtml:DllGetClassObject Unknown class {3050f3d6-98b5-11cf-bb82-00aa00bdce0b} err:ole:apartment_getclassobject DllGetClassObject returned error 0x80040111 err:ole:create_server class {3050f3d6-98b5-11cf-bb82-00aa00bdce0b} not registered fixme:ole:CoGetClassObject CLSCTX_REMOTE_SERVER not supported err:ole:CoGetClassObject no class object {3050f3d6-98b5-11cf-bb82-00aa00bdce0b} could be created for context 0x17 Нужно смотреть DllGetClassObject в mshtml
Да, в DllGetClassObject нет "IsEqualGUID" для этого CLSID'а. Отсюда сразу возвращается Unknown class. Нужно дорабатывать mshtml.dll для поддержки нужного интерфейса.
Тогда нам понадобится и своё описание этого интерфейса, которое надо сделать наподобие http://doc.ddart.net/msdn/header/include/iimgctx.h.html Судя по всему, основную часть можно взять здесь, со свободной лицензией: http://www.codeproject.com/KB/graphics/JianImgCtxDecoder.aspx Вообще OleLoadPicture умеет загружать PNG и различные другие форматы. mshtml действует через неё? http://www.codeproject.com/KB/graphics/render.aspx См. также багу 1973
commit ce1b59cea29c173b38a26ba8d1e9585d31dbd85f Author: Konstantin Kondratyuk <kondratyuk@etersoft.ru> Date: Tue Jun 24 17:41:59 2008 +0400 mshtml: Add IImgCtx interface Добавляет интерфейс IImgCtx в mshtml. Теперь из него вызывается метод Load(), который нам и нужно реализовать.
Ещё нужно не забыть, что все методы, кроме Load и SelectChange, реализованы как пустые методы БЕЗ ПАРАМЕТРОВ. Нужно переделать .idl, перегенерировать .h и переписать реализацию в .c
Load вызывается с URL: C:\\windows\\temp\\KMSchool\\{5DC85E47-2558-4B57-97AB-B2B8BA15A5A7}\\TL_00.bmp Далее fixme:mshtml:ImgCtx_GetStateInfo is not implemented и окно с сообщением "Невозможно получить состояние картинки"
GetStateInfo - из тех функций, для которых возвращаемые данные в моей реализации некорректны. Вот исходные параметры: ULONG FAR* pulState, struct tagSIZE FAR* psize, BOOL fClearChanges У меня в imgctx.idl параметров вообще нет... Возвращая S_OK из GetStateInfo получаем Exception
После нормального объявления GetStateInfo и возврата IMGLOAD_NOTLOADED (ну мы ведь действительно ничего не загрузили ещё) ошибок нет, но вместо красивой живой картинки чёрный экран. Не падает, но и не показывает.
Пример использования на C: http://www.codeproject.com/KB/winsdk/win32image.aspx Все примеры лежат здесь: /var/ftp/pvt/WINE\ tests/Technologies/ImgCtx
Бага вполне рабочая, но на неё нужно время. Если просто возвратить статус успешно загруженной картинки, то начинает выполняться множество действий, которые вызывают множество ошибок недореализованности. К версии 1.0 вполне реально.
Откатил Костин патч, добавляющий реализацию интерфейса: commit 6d631f112927e90b4e8bc2c8f54e48c95d5ca65f Author: Konstantin Kondratyuk <kondratyuk@etersoft.ru> Date: Tue Jun 24 17:41:59 2008 +0400 mshtml: Add IImgCtx interface В winehq появилась своя реализация этого интерфейса. Насколько я понял, она ничуть не хуже нашей. Надо посмотреть. Возможно нашу реализацию можно совсем выбросить.
(В ответ на comment #12) > В winehq появилась своя реализация этого интерфейса. Насколько я понял, она > ничуть не хуже нашей. > Надо посмотреть. Возможно нашу реализацию можно совсем выбросить. Нашу реализацию и так нужно выбросить, если там появился хотя бы скелет интерфейса. Она ничего не умела, только создавать экземпляр класса и не ронять программу. ЛЮБАЯ реализация в winehq лучше того, что было нами сделано когда-то.
Патч возвращать не будем.