Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен приватный мониторинг счета? В Сигналах есть такая возможность!
o_O
Модератор
23612
o_O 2011.05.30 12:14 

Пытаюсь поставить на чарт просмотрщик HTML страниц из DLL

Ориентировочно три варианта как это сделать

Первый вариант - использовать CHtmlView

#include "afxhtml.h"

//------------------------------------------------------------------
extern "C" BOOL PASCAL EXPORT CreateHtml(int hWnd)
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());

  HWND wnd=(HWND)hWnd;                    // хендл окна
  ShowWindow(wnd, SW_HIDE); // скрыли чарт

  CWnd *pwnd; pwnd=new CWnd; pwnd->Attach(GetParent(wnd)); // получили окно MFC

  // создали 
  CHtmlView * pView = (CHtmlView *)RUNTIME_CLASS(CHtmlView)->CreateObject();
  pView->Create(NULL, "TEST", WS_VISIBLE|WS_CHILD, CRect(1,1,400,400), pwnd, 6510);
  pView->ShowWindow(SW_SHOW); // показали кнопку
  pView->UpdateWindow();
  
  pView->Navigate("https://www.mql4.com/");
  
  return (0);
}

Но при наличии красной строки Navigate - происходит креш терминала. К слову - создание CHtmlView в диалоговом окне в обычном приложении MFC прокатывает нормально. Всё работает.

2. Второй вариант - сгенерировать CWebBrowser2 из компонента.
Но результат аналогичный. При создании окна CWebBrowser2 ошибок нет, но как только пытаюсь пойти по адресу в Navigate, то сразу креш.

3. Третий (не лишний, а запасной) вариант через интерфейс IWebBrowser2
Пытаюсь сделать по примеру из архива. Но в нём есть другая проблема - он написан чисто на c, и перенести адекватно в DLL не получается.
Интересует конкретно функция

long DisplayHTMLPage(HWND hwnd, LPTSTR webPageName)
{
  IWebBrowser2    *webBrowser2;
  VARIANT                 myURL;
  IOleObject              *browserObject;

  browserObject = *((IOleObject **)GetWindowLong(hwnd, GWL_USERDATA));
  if (!browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2))
  {
    VariantInit(&myURL);
    myURL.vt = VT_BSTR;

  #ifndef UNICODE
  {
    wchar_t         *buffer;
    DWORD           size;

    size = MultiByteToWideChar(CP_ACP, 0, webPageName, -1, 0, 0);
    if (!(buffer = (wchar_t *)GlobalAlloc(GMEM_FIXED, sizeof(wchar_t) * size))) goto badalloc;
    MultiByteToWideChar(CP_ACP, 0, webPageName, -1, buffer, size);
    myURL.bstrVal = SysAllocString(buffer);
    GlobalFree(buffer);
  }
  #else
    myURL.bstrVal = SysAllocString(webPageName);
  #endif
    if (!myURL.bstrVal)
    {
      badalloc:       webBrowser2->lpVtbl->Release(webBrowser2);
      return(-6);
    }

    webBrowser2->lpVtbl->Navigate2(webBrowser2, &myURL, 0, 0, 0, 0);
    VariantClear(&myURL);
    webBrowser2->lpVtbl->Release(webBrowser2);
    return(0);
  }
  return(-5);
}

К сожалению вылазят ошибки отсутствия в IOleObject нужных методов.
Думаю, что я подсоединяю несовместимые заголовочные файлы с проектом DLL.

Вобщем вопрос простой - как сие чудо (любой из вариантов) заставить работать на благо человечества.
У кого есть мысли? буду копать.

Файлы:
simple.zip 3111 kb
Dmitry Fedoseev
42373
Dmitry Fedoseev 2011.05.30 13:13  
В чем задача, просто браузер открыть со страницей из эксперта.
o_O
Модератор
23612
o_O 2011.05.30 14:02  
открыть на чарте. вместо графика.

но в общем, вопрос изначально стоит по другому.

так как единственное что мы можем передать из терминала в DLL это хендл окна.
то необходимо используя этот хендл создать просмотр HTML.

стандартные элементы управления на MFC типа кнопок, текста, или работа с CDC передаваемого окна. Всё ок.
Но вот с этими классами для веба надо наверно ласковей, а не топором как обычно происходит :)

Slawa
Модератор
6799
Slawa 2011.05.30 15:01  

RSDN Вам в помощь

Ещё на прошлой работе я решал аналогичную проблему. Вот обсуждение http://www.rsdn.ru/forum/com/42669.flat.1.aspx - там есть всё, и про оле-объекты и про то, как создать для них хост.

o_O
Модератор
23612
o_O 2011.05.30 15:26  
stringo:

RSDN Вам в помощь

Ещё на прошлой работе я решал аналогичную проблему. Вот обсуждение http://www.rsdn.ru/forum/com/42669.flat.1.aspx - там есть всё, и про оле-объекты и про то, как создать для них хост.


Спасибо, да много, я бы сказал нереально много :) и именно по варианту с IWebBrowser2, который я так и не смог запустить в DLL, чтоб проверить.

В принципе меня устраивает работа классов CHtmlView. Использую в приложениях.

Поэтому хотел бы сначала помирить терминал с ними через DLL. Понять почему он падает именно при вызове функции Navigate.
Конечно, уверен что проблема глубоко в недрах моих незнаний (иначе жил бы в Сочи :).

o_O
Модератор
23612
o_O 2011.05.30 15:33  
Кстати, я задумался - может проблема в типе DLL, который я выбираю - "Обычная DLL с использованием общей DLL MFC".?
Slawa
Модератор
6799
Slawa 2011.05.30 15:42  
sergeev:

Спасибо, да много, я бы сказал нереально много :) и именно по варианту с IWebBrowser2, который я так и не смог запустить в DLL, чтоб проверить.

В принципе меня устраивает работа классов CHtmlView. Использую в приложениях.

Поэтому хотел бы сначала помирить терминал с ними через DLL. Понять почему он падает именно при вызове функции Navigate.
Конечно, уверен что проблема глубоко в недрах моих незнаний (иначе жил бы в Сочи :).


Я сейчас пересмотрел все свои старые обсуждения на RSDN. Там есть объяснения таким падениям. На прошлой работе (10 лет назад) я плотно занимался встраиванием собственного веб браузера в собственную dll. Посмотрите все сообщения пользователя stringo, может найдёте что-то нужное.

o_O
Модератор
23612
o_O 2011.05.30 16:17  

ок. обязательно просмотрю. сейчас поработал с первой ссылкой. Создал DLL, добавил ATL -> HTML Control.

Визард добавил класс. Вобщем всё прошло гут.

Далее сделал функцию создания интерфейса Web-хоста на чарте (по аналогии со ссылкой).

extern "C" int PASCAL EXPORT CreateWeb(int hWnd)
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());

  HWND pwnd=GetParent((HWND)hWnd); // получили родителя для создания в нём Web

  ShowWindow((HWND)hWnd, SW_HIDE); // скрыли чарт
        
  CComObject<CHtm> * pWebBrowserHost = NULL;
  HRESULT hr = CComObject<CHtm>::CreateInstance(&pWebBrowserHost);
  if (SUCCEEDED(hr))
  {
    RECT rcClient = { 0, 0, 640, 480 };
    pWebBrowserHost->Create(pwnd, rcClient, NULL, WS_POPUP|WS_VISIBLE|WS_THICKFRAME);
    IWebBrowser2 * pWebBrowser = pWebBrowserHost->m_spBrowser;

    pWebBrowser->Navigate(L"https://www.mql4.com", 0, 0, 0, 0); // и именно тут снова креш
    return(10);
  }
  return(-1);
}


Радует конечно, что терминал так стабильно падает именно на этой фунции. :)

Файлы:
hh1.zip 39 kb
o_O
Модератор
23612
o_O 2011.05.30 16:57  
stringo:


Я сейчас пересмотрел все свои старые обсуждения на RSDN. Там есть объяснения таким падениям. Посмотрите все сообщения пользователя stringo, может найдёте что-то нужное.

Блин, на RSDN по-моему таже проблема. Поиск :)

со строкой поиска (stringo WebBrowser) находится только один пост за 2003 год.

Slawa
Модератор
6799
Slawa 2011.05.30 17:18  
sergeev:
Блин, на RSDN по-моему таже проблема. Поиск :)

со строкой поиска (stringo WebBrowser) находится только один пост за 2003 год.


Зайти в профиль и выбрать "все сообщения пользователя"
Андрей
1890
Андрей 2011.05.30 17:25  
А отдельный поток для создания веб-браузера не стартует?
И среду приложения в Dll нужно проинициализировать вообще-то...
/ /1234
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий