Bug 1955

Summary: Невозможно создать экземпляр класса IImgCtx
Product: Wine School Reporter: Константин Кондратюк <kondratyuk>
Component: КМ ШколаAssignee: Константин Кондратюк <kondratyuk>
Status: CLOSED FIXED QA Contact:
Severity: normal    
Priority: P5 CC: kondratyuk, lav, vitperov, vostok
Version: 0.7   
Target Milestone: ---   
Hardware: PC   
OS: Linux   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on: 1973    
Bug Blocks: 2585, 42, 1527, 1528    

Description Константин Кондратюк 2008-06-20 10:52:16 MSD
Класс IImgCtx даже не зарегистрирован в системе. И скорее всего, не реализован.
Ошибка возникает при открытии документа в разделе "Панорама (тайм-лайн)".
Находится в "Учитель"-"Индивидуальный портфель"-"Рабочие материалы"-"Панорама (тайм-лайн)"
Comment 1 Анатолий Лютин 2008-06-20 10:55:03 MSD
Если ещё не известно...

Способ 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

;)
Comment 2 Константин Кондратюк 2008-06-20 11:43:44 MSD
И всё-таки 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
Comment 3 Константин Кондратюк 2008-06-20 13:53:40 MSD
Да, в DllGetClassObject нет "IsEqualGUID" для этого CLSID'а. Отсюда сразу возвращается Unknown class.
Нужно дорабатывать mshtml.dll для поддержки нужного интерфейса.
Comment 4 Vitaly Lipatov 2008-06-23 17:53:09 MSD
Тогда нам понадобится и своё описание этого интерфейса, которое надо сделать наподобие
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
Comment 5 Константин Кондратюк 2008-06-24 17:46:46 MSD
commit ce1b59cea29c173b38a26ba8d1e9585d31dbd85f
Author: Konstantin Kondratyuk <kondratyuk@etersoft.ru>
Date:   Tue Jun 24 17:41:59 2008 +0400

    mshtml: Add IImgCtx interface

Добавляет интерфейс IImgCtx в mshtml. Теперь из него вызывается метод Load(), который нам и нужно реализовать.
Comment 6 Константин Кондратюк 2008-06-24 17:52:08 MSD
Ещё нужно не забыть, что все методы, кроме Load и SelectChange, реализованы как пустые методы БЕЗ ПАРАМЕТРОВ. Нужно переделать .idl, перегенерировать .h и переписать реализацию в .c
Comment 7 Константин Кондратюк 2008-06-24 18:05:19 MSD
Load вызывается с URL:
C:\\windows\\temp\\KMSchool\\{5DC85E47-2558-4B57-97AB-B2B8BA15A5A7}\\TL_00.bmp

Далее 
fixme:mshtml:ImgCtx_GetStateInfo is not implemented
и окно с сообщением "Невозможно получить состояние картинки"
Comment 8 Константин Кондратюк 2008-06-24 18:20:08 MSD
GetStateInfo - из тех функций, для которых возвращаемые данные в моей реализации некорректны.

Вот исходные параметры: ULONG FAR* pulState, struct tagSIZE FAR* psize, BOOL fClearChanges
У меня в imgctx.idl параметров вообще нет...

Возвращая S_OK из GetStateInfo получаем Exception
Comment 9 Константин Кондратюк 2008-06-24 20:14:04 MSD
После нормального объявления GetStateInfo и возврата IMGLOAD_NOTLOADED (ну мы ведь действительно ничего не загрузили ещё) ошибок нет, но вместо красивой живой картинки чёрный экран. Не падает, но и не показывает.
Comment 10 Vitaly Lipatov 2008-06-24 22:36:53 MSD
Пример использования на C:
http://www.codeproject.com/KB/winsdk/win32image.aspx

Все примеры лежат здесь:
/var/ftp/pvt/WINE\ tests/Technologies/ImgCtx
Comment 11 Константин Кондратюк 2008-06-25 16:05:24 MSD
Бага вполне рабочая, но на неё нужно время.
Если просто возвратить статус успешно загруженной картинки, то начинает выполняться множество действий, которые вызывают множество ошибок недореализованности.

К версии 1.0 вполне реально.
Comment 12 Виталий Перов 2011-06-21 15:54:34 MSK
Откатил Костин патч, добавляющий реализацию интерфейса:

commit 6d631f112927e90b4e8bc2c8f54e48c95d5ca65f
Author: Konstantin Kondratyuk <kondratyuk@etersoft.ru>
Date:   Tue Jun 24 17:41:59 2008 +0400

    mshtml: Add IImgCtx interface

В winehq появилась своя реализация этого интерфейса. Насколько я понял, она ничуть не хуже нашей.
Надо посмотреть. Возможно нашу реализацию можно совсем выбросить.
Comment 13 Константин Кондратюк 2011-06-21 16:20:56 MSK
(В ответ на comment #12)
> В winehq появилась своя реализация этого интерфейса. Насколько я понял, она
> ничуть не хуже нашей.
> Надо посмотреть. Возможно нашу реализацию можно совсем выбросить.

Нашу реализацию и так нужно выбросить, если там появился хотя бы скелет интерфейса. Она ничего не умела, только создавать экземпляр класса и не ронять программу. ЛЮБАЯ реализация в winehq лучше того, что было нами сделано когда-то.
Comment 14 Константин Кондратюк 2011-09-09 14:31:21 MSK
Патч возвращать не будем.