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

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

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

Студворк — интернет-сервис помощи студентам
Собсно, вопрос. Есть 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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,460
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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
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
33398 / 21508 / 8236
Регистрация: 22.10.2011
Сообщений: 36,906
Записей в блоге: 12
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
Ответ Создать тему
Опции темы

Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru