CHtmlView или WebBrowser на чарте (и другие features) - страница 2

 
   _variant_t url=_bstr_t(_T("about:blank"));
   pWebBrowser->Navigate2(&url,NULL,NULL,NULL,NULL);

Для начала попробуйте так. Насколько я помню на вход надо подавать не простую строку, а оле-строку

А вообще, неплохо бы сначала проверить pWebBrowser на NULL

 
stringo:
Зайти в профиль и выбрать "все сообщения пользователя"
есть. но перавя ваша ссылка самая лучшая по теме.

jartmailru:
А отдельный поток для создания веб-браузера не стартует?
И среду приложения в Dll нужно проинициализировать вообще-то...


вы имеете ввиду пример из MSDN ? http://msdn.microsoft.com/en-us/library/aa752127.aspx. Да. он работает отлично. Окно с эксплорером появляется.

if (SUCCEEDED(OleInitialize(NULL)))
{
   IWebBrowser2*    pBrowser2;
   CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_LOCAL_SERVER, IID_IWebBrowser2, (void**)&pBrowser2);
   if (pBrowser2)
...
...
Но надо не отдельное, а вместо чарта.

Честно, про среду приложения в DLL не знаю даже (знаний маловато)
 
stringo:

Для начала попробуйте так. Насколько я помню на вход надо подавать не простую строку, а оле-строку

делал, но я инициализировал как в примере MSDN (так как _bstr_t писало undeclared identifier)

VARIANT vEmpty;
VariantInit(&vEmpty);
BSTR bstrURL = SysAllocString(L"https://www.mql4.com");
hr=pWebBrowser->Navigate(bstrURL, &vEmpty, &vEmpty, &vEmpty, &vEmpty);

А вообще, неплохо бы сначала проверить pWebBrowser на 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;  // =0

Код выполняется. pWebBrowserHost - создаётся и получает хендл.

а указатель m_spBrowser (pWebBrowser) =0.

 

смог локализовать строку с проблемой.

к сожалению это в OnCreate

LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
  CAxWindow wnd(m_hWnd);
  HRESULT hr = wnd.CreateControl(IDH_HTM); // вот здесь не создаётся и выходит
  if (!SUCCEEDED(hr)) return (-1);

m_hWnd проверил, указатель живой, MessageBox открывает.

пытался другие варианты
HRESULT hr = wnd.CreateControl(L"https://www.mql4.com");
HRESULT hr = wnd.CreateControl(L"about:blank");

Может ли быть проблема, с самим окном m_hWnd (это родитель - GetParent() - чарта) (типа не подходит по каким то причинам)?
Но ведь обычный CButton на нем создаются успешно...

Файлы:
hh1_1.zip  44 kb
 
sergeev:
Честно, про среду приложения в DLL не знаю даже (знаний маловато)

Я имел в виду, что при инициализации приложений МФС, есть объектик
типа CApplication, и ещё какие-то статические штуки.
В Wtl я с этим долго возился- потому что диалоги при создании
сразу куда-то лезут и получаются исключения и null-pointer'ы.
Так вот всё это хозяйство я локализовывал, чтобы его можно было
поднимать в отдельном потоке (там же будет и цикл обработки сообщений).

 
У меня есть подозрение, что вставка контрола в чужое окно НЕ возможно
без перехвата родной оконной функции. А для такого контрола как браузер,
дело может оказаться сложноватым. Может быть, можно будет диалог с собственным
потоком обработки событий прописать внутрь чужого окна?

2011-05-31-08-30: добавил не
 

поток CWinThread сделать можно. но для его создания наверно не нужны никакие Instance (то есть явно при создании я это не делал и не вижу похожего ничего кроме функции CWinThread::InitInstance). Обмен сообщениями с поток организовывал через m_pMainWnd.
с приложениями это понятно, но надо доставать всё и создавать из DLL, а получается что она более требовательна к знаниям...

 
jartmailru:

Может быть, можно будет диалог с собственным потоком обработки событий прописать внутрь чужого окна?

Может быть... // и я все еще надеюсь на использования классов CHtmlView вместо явного ole-интерфейса :)
а какие классы (CDialog ?) нужны для вписывания диалога в окно чарта? такое вообще реально ? // не вернется ли всё на ту же ошибку
 
sergeev:
Может быть... // и я все еще надеюсь на использования классов CHtmlView вместо явного ole-интерфейса :)
а какие классы (CDialog ?) нужны для вписывания диалога в окно чарта? такое вообще реально ? // не вернется ли всё на ту же ошибку
Не в курсе MFC :-).
Вроде любой диалог сгодится- достаточно у него убрать border & title.
и он становится обычной панелькой, привязанной к своему Rect.
А вот какие там отношения с очередями сообщений будут...
не в курсе- так не пробовал.
 

Помогите понять такую вещь.

в ресурсе DLL создал диалог. Сделал под него класс CTestDlg.

Далее в DLL вызываю его так:

#include "TestDlg.h"
CTestDlg *dlg;

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

  CWnd *wnd; wnd=new CWnd; wnd->Attach(GetParent((HWND)hWnd));
  dlg= new CTestDlg(wnd);

  if (!dlg->Create(IDD_DIALOG1, wnd)) return -1;
  dlg->ShowWindow(SW_SHOW);
  return 1;
}

Диалог создаётся, всё ок.

Но он появляется только на мгновение. до выхода из функции. Не могу понять - почему диалог уничтожается ? ведь переменная объявлена снаружи функции, как указатель... а получается она уничтожается при выходе из функции...

Где нужно прописать переменную dlg или как сделать правильно, чтоб он не удалялся при выходе?