Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1

Как записать в файл (или нарисовать в DC) IHTMLImgElement

04.07.2012, 19:36. Показов 3770. Ответов 11

Author24 — интернет-сервис помощи студентам
Собсно, вопрос. Есть IHTMLImgElement. Пытаюсь кастануть к IHTMLElementRender:
C++
1
2
3
4
5
6
7
        CComQIPtr<IHTMLElementRender> spElemRender;
        if (FAILED(pElement->QueryInterface(IID_IHTMLElementRender, 
          (void**)&spElemRender)))
        {
          AfxMessageBox(_T("Unable to create render of the body element."));
          return;
        }
Элементы получены с помощью
IHTMLDocument2->get_images()

Функция фейлится, почему - не знаю.

Из кеша вытащить рисунки тоже не получается:
C++
1
2
3
4
5
6
            INTERNET_CACHE_ENTRY_INFO cache_entry;
            ZeroMemory(&cache_entry, sizeof(cache_entry));
            cache_entry.dwStructSize = sizeof(cache_entry);
            DWORD entry_size = sizeof(cache_entry);
            BOOL res = RetrieveUrlCacheEntryFile(img_src, &cache_entry, &entry_size, 0);
            if(!res)
Закачивать по урле - вариант не подходит - кое-где нужны куки для доступа к ресурсу.

Помогите задампить элемент в файл (либо нарисовать в HDC).

Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.07.2012, 19:36
Ответы с готовыми решениями:

Как имеющийся список записать в файл или считать
Люди кто шарит хелп Нужно мою очередь как-то записать в файл или считать #define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt;...

Как записать в файл что-либо!(строку или абзац)?
Как записать в файл что-либо!(строку или абзац)?

Как открыть файл doc или docx и записать их текст в TextBox
Прежде чем огласить проблему хочу сказать, что я в курсе того, что такие темы создавались на форуме, но вменяемого ответа на вопрос я не...

11
Модератор
 Аватар для vxg
3402 / 2173 / 353
Регистрация: 13.01.2012
Сообщений: 8,430
05.07.2012, 13:57
QueryInterface код какой возвращает?
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
05.07.2012, 14:18  [ТС]
E_NOINTERFACE
0
Модератор
 Аватар для vxg
3402 / 2173 / 353
Регистрация: 13.01.2012
Сообщений: 8,430
05.07.2012, 21:21
ну как бы название само за себя говорит - значит нету такого интерфейса у вашего объекта. а точно должен быть? я просто с таким объектом не работал. если для объекта заявлено что он поддерживает такой интерфейс - значит должен быть. может не тот объект?
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
05.07.2012, 22:01  [ТС]
Фиг его знает, поддерживает ли он - я с COMом знаком разве что понаслышке.
Но по меньшей мере несколько туториалов в сети говорят, что сохранить елемент можно через этот интерфейс.

В любом случае, остаётся вопрос - как сохранить рисунок, соответствующий элементу IHTMLImgElement из IHTMLDocument ?
0
Модератор
 Аватар для vxg
3402 / 2173 / 353
Регистрация: 13.01.2012
Сообщений: 8,430
06.07.2012, 09:27
что то не так... вообще в теории в результате должно быть
"S_OK if the interface is supported, S_FALSE if not."
хотя конкретным реализациям разрешено возвращать все что они захотят...
вряд ли в этом дело, но странный момент вот здесь:
C++
1
pElement->QueryInterface(IID_IHTMLElementRender, (void**)&spElemRender)
- так нельзя. в spElemRender функция запишет указатель на интерфейс. а у вас по этому адресу объект сидит - она его уничтожит. я конечно не знаю как там ATL работает, может она скушает за счет экзотической структуры объектов класса CComQIPtr, но... огромное сомнение.
делал так
C++
1
2
3
4
5
6
    IMyObject *pi = 0;
    hr = pui->QueryInterface
    (
        IID_IMyObject,
        (LPVOID *)&pi
    );
Добавлено через 1 минуту
...только в этом случае нужно самому заботится о AddRef и Release

Добавлено через 44 секунды
...ну, или присвоить pi объекту CComQIPtr - ATL вроде такое скушает
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33138 / 21432 / 8221
Регистрация: 22.10.2011
Сообщений: 36,753
Записей в блоге: 9
06.07.2012, 12:24
Собсно, вопрос. Есть IHTMLImgElement. Пытаюсь кастануть к IHTMLElementRender:
Как создавался браузер? Через CoCreateInstance? Тогда такой каст не пройдет (будет возвращаться E_NOINTERFACE, что, собственно, и происходит) и картинку не получишь. А если создать его через CreateControl + CLSID_WebBrowser, а потом получить интерфейс через

C++
1
2
LPUNKNOWN unknown = browserWnd.GetControlUnknown();
HRESULT hr = unknown->QueryInterface(IID_IWebBrowser2, (void**) &m_Browser);
, и просить картинки через m_Browser - то все прекрасно получается.
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
06.07.2012, 18:19  [ТС]
Ребят, спасибо!
Как только попробую - отпишусь что получилось.

Добавлено через 18 минут
Цитата Сообщение от UI Посмотреть сообщение
Как создавался браузер?
Собсно, вот так:

C++
1
2
3
4
    static UINT MSG = RegisterWindowMessage(_T("WM_HTML_GETOBJECT"));
    SendMessageTimeout(hWnd, MSG, 0, 0, SMTO_ABORTIFHUNG, 1000, &lRes);
    
    hr    =    (*pfObjectFromLresult)(lRes,IID_IHTMLDocument2,0,(void**)ppHTMLDoc2);
где ppHTMLDoc2 это IHTMLDocument2**
А pfObjectFromLresult = (LPFNOBJECTFROMLRESULT)::GetProcAddress( hInstOLEACC, "ObjectFromLresult" );

Добавлено через 2 часа 57 минут
C++
1
2
3
4
IHTMLElementRender* spElemRender;
                HRESULT res;
                if ((res = pElement->QueryInterface(
                  IID_IHTMLElementRender,(void**)&spElemRender)) != S_OK )
всё равно возвращает NO_INTERFACE
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
12.07.2012, 15:12  [ТС]
Ребята, что ещё можно сделать ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33138 / 21432 / 8221
Регистрация: 22.10.2011
Сообщений: 36,753
Записей в блоге: 9
12.07.2012, 21:02
Лучший ответ Сообщение было отмечено volvo как решение

Решение

Во-первых, не использовать IHTMLElementRender, ибо его метод DrawToDC, который ты хочешь использовать, уже deprecated в IE9: IHTMLElementRender :: DrawToDC Method

К тому же, еще кое что. Даже если плюнуть на все и использовать метод DrawToDC. Вот такой код:
C++
1
2
3
4
5
6
7
8
    IHTMLElementRender *spElemRender = NULL;
    HRESULT hr = Image->QueryInterface(IID_IHTMLElementRender, (void**)&spElemRender);
    if(SUCCEEDED(hr) && spElemRender)
    {
        HDC hdc = ...
        spElemRender->DrawToDC(hdc);
        ::ReleaseDC(..., hdc);
    }
великолепно работает, когда браузер, в котором открыта страница, находится в твоем приложении (проверил специально, положив на форму в Builder-е WebBrowser, и получив через get_images загруженные на страничку изображения, которые прекрасно отрисовались на канве через IHTMLElementRender), но отказывается работать, если IHTMLDocument2 браузера получается из чужого приложения. Вероятно, тут та же ситуация, что и с IViewObject interface, для которого ясно написано:
Unlike most other interfaces, IViewObject cannot be marshaled to another process. This is because device contexts are only effective in the context of one process.
Видно, не для всех интерфейсов всё пишут, потому что поиск в сети выводит на десятки обсуждений подобных вопросов, решения в которых так и не найдено.
0
Эксперт С++
 Аватар для Andrew_Lvov
261 / 191 / 10
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
12.07.2012, 21:23  [ТС]
То есть, что бы получить DC, мне нужно выполнять код в контексте чужого процесса ?
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33138 / 21432 / 8221
Регистрация: 22.10.2011
Сообщений: 36,753
Записей в блоге: 9
13.07.2012, 11:21
Цитата Сообщение от Andrew_Lvov Посмотреть сообщение
что бы получить DC, мне нужно выполнять код в контексте чужого процесса ?
А позволит тебе IE выполнять твой код в своем контексте? Тебе фактически придется писать BHO.

Кстати, таки да, IHTMLElementRender не является маршалируемым, точно так же, как и IViewObject. Они оба работают только в рамках одного процесса.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.07.2012, 11:21
Помогаю со студенческими работами здесь

Как одну или несколько переменных записать в файл и при запуске считать их
Всем привет. Скорее всего уже задавался данный вопрос, но я не нашел(ИЛИ слепой). Как одну или несколько переменных записать в файл и при...

Как записать объект(или хотя бы его поля ) в файл в бинарном виде и считать оттуда?
В txt файлик коллекцию обьектов записать необходимо, и считать потом оттуда.

Как gl_line_loop заполнить цветом или им же нарисовать нарисовать сферу
или же нарисовать примерно точно также как на изображении, и потом при диалоге изменения цвета закрасить их, желательно с линиями, их буду...

Как записать Как записать в ADO recordset значение NULL через datacombo или textbox?
Перехожу с Access на SQLserver+VB. ADO recordset открыт через DataEnvironment, client-side, LockOptimistic. Пытаюсь на Validate...

Как запустить Batch-файл? Как диагностировать проблему или ошибки в синтаксисе, когда Bat-файл не работает или "вылетает". [Руководство]
Как запустить Batch-файл? Как диагностировать проблему или ошибки в синтаксисе, когда Bat-файл не работает или &quot;вылетает&quot;. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

Новые блоги и статьи
Создаем RESTful API с Laravel
Jason-Webb 28.04.2025
REST (Representational State Transfer) — это архитектурный стиль, который определяет набор принципов для создания веб-сервисов. Этот подход к построению API стал стандартом де-факто в современной. . .
Дженерики в C# - продвинутые техники
stackOverflow 28.04.2025
История дженериков началась с простой идеи — создать механизм для разработки типобезопасного кода без потери производительности. До их появления программисты использовали неуклюжие преобразования. . .
Тестирование в Python: PyTest, Mock и лучшие практики TDD
py-thonny 28.04.2025
Тестирование кода играет весомую роль в жизненном цикле разработки программного обеспечения. Для разработчиков Python существует богатый выбор инструментов, позволяющих создавать надёжные и. . .
Работа с PDF в Java с iText
Javaican 28.04.2025
Среди всех форматов PDF (Portable Document Format) заслуженно занимает особое место. Этот формат, созданный компанией Adobe, превратился в универсальный стандарт для обмена документами, не зависящий. . .
Динамические массивы в C++ - создание и использование
NullReferenced 27.04.2025
Динамические массивы представляют собой один из фундаментальных инструментов программирования на C++, позволяющий создавать структуры данных, размер которых определяется во время выполнения. . .
Асинхронный JavaScript: Промисы, Async/Await и Fetch API
Reangularity 27.04.2025
Пользователь заходит на веб-страницу, нажимает кнопку и. . . ничего не происходит. Сайт словно замер. Через несколько секунд всё внезапно оживает, но пользователь уже успел закрыть вкладку. Знакомая. . .
Management on GitLab and repository management in Visual Studio code
jigi33 27.04.2025
- repo management on GitLab - CI/ CD in GitLab - VCS repository management in Visual Studio code (see attachments)
Kanban или Scrum - что выбрать?
EggHead 27.04.2025
Kanban и Scrum — уже много лет удерживают лидирующие позиции среди гибких подходов. Руководители проектов и команды разработчиков то и дело сталкиваются с дилеммой: какой из этих двух методов выбрать. . .
Кастомные Middleware на C# в ASP.NET Core
UnmanagedCoder 27.04.2025
Разработка веб-приложений сегодня мало напоминает монолитное программирование прошлых лет. На смену громоздким блокам кода пришла модульная архитектура, где каждый компонент выполняет строго. . .
Анализ и линтинг кода JavaScript: ESLint, Prettier и JSHint
run.dev 26.04.2025
JavaScript прошёл долгий путь от простого языка для анимации веб-страниц до основы современной веб-разработки. С ростом сложности приложений, увеличением кодовых баз и масштабированием команд. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru