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
Если ещё не известно... Способ 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 лучше того, что было нами сделано когда-то. Патч возвращать не будем. |