wxAutomationObject vs wxIE

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

wxAutomationObject vs wxIE

Post by sergiokey » Wed Apr 08, 2009 7:11 pm

здравствуйте.
Тут появилась такая проблема:
необходимо вставить в приложение браузер. к сожалению, wxHTML не подходит:(

попробовал 2 варианта: wxIE (старый, очень старый) - где показывалась работа с wxactivec1.0 - работает, но несколько через задницу.
второй вариант - wxAutomationObject с m_WebBrowser.GetInstance(wxT("Shell.Explorer")). Но при запуске метода

Code: Select all

	
	wxVariant args[5];
	args[0] = url;
	args[1] = (wxChar)navNoReadFromCache;
	args[2] = wxT("_self");

	m_WebBrowser.CallMethod(wxT("Navigate"),5,args);
	return true;
также пробовал с помощью IWebBrowser2, зарегестрировав новый тип
WX_DECLARE_AUTOOLE(wxAutoOleIWebBrowser2, IWebBrowser2)
и работая с ним, ошибка та же
вылетает гдето в середине automtn.cpp в функции wxConvertOleToVariant(oleElement, vElement) (строка 758)
как я понимаю при обработке события от com объекта при преобразовании из VARIANT в wxVariant

у кого возникала такая проблема, откликнитесь пожалуйста

ps. Xp Profesional,Wxwidgets2.8.10, Visual C++ 9.0

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 4:11 am

А почему у тебя размер массива 5 (wxVariant args[5]) а внутрь ты запихиваешь только 3 штуки? args[0] args[1] args[2] ну и потом m_WebBrowser.CallMethod(wxT("Navigate"),5/*а вот эта пятерка от куда, если их там всего то 3*/,args);

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 6:57 am

огромное спасибо, помогло)
честно говоря, я думал, что если элементы массива не приравнивать, то они инициализируются по умолчанию

теперь получилось так: после инициализации

Code: Select all

	if (!m_WebBrowser.GetInstance(wxT("Shell.Explorer")))
		if (!m_WebBrowser.CreateInstance(wxT("Shell.Explorer"))){
			m_Correct = false;
			return;
		}
	mp_Container = new wxActiveXContainer(	this,
											IID_IWebBrowser2,
											(IUnknown*)m_WebBrowser.GetDispatchPtr());
при вызове метода m_WebBrowser.GetProperty(wxT("Offline")) выдает true, хотя должен false

и при вызове метода Navigate
выдает сообщение "Cannot find an active object"

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 8:28 am

при вызове метода m_WebBrowser.GetProperty(wxT("Offline")) выдает true, хотя должен false
Я надеюсь ты делаешь что то типа

Code: Select all

wxVariant line = m_WebBrowser.GetProperty(wxT("Offline"));//тут она всегда вернет true если смогло взять ole объект
bool tmp = line.GetBool();//или GetLong() тут уже само значение
Поищи по форуму тут же есть примеры с екселем в справку загляни там тоже кое-что есть.
Про навигате подозреваю то же самое, хотя ты код не показал - это мне хрустальный шар подсказывает.

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 9:16 am

да, один в один так и делаю, хрустальный шар тебя не обманывает :) , но выводит не то что нужно

Code: Select all

bool IECtrl::IsOnline(){
	wxVariant vx;

	vx = m_WebBrowser.GetProperty(wxT("Offline"));
	return !vx.GetBool();
}
а Navigate я пекределал так:

Code: Select all

m_WebBrowser.CallMethod(wxT("Navigate"),url,(long)navNoReadFromCache,wxT("_SELF"),wxT(""),wxT(""));
при обращении к Navigate он открывает новое окно интернет эксплорера и открывает там ссылку :(
все создается нормально, никакие указатели нулевыми не остаются
у меня подозрение что контейнер както не очень хорошо создается:

Code: Select all

m_WebBrowser.CreateInstance(wxT("Shell.Explorer")));
mp_Container = new wxActiveXContainer(	this, IID_IDispatch, (IUnknown*)m_WebBrowser.GetDispatchPtr());
возможно вместо IID_IDispatch нужно писать чтото другое, но что именно, я не понимаю. Возможно IID_IWebBrowser2, но с этим тоже не работает

я в печали: по хорошему, со старым примером wxIE все работает, но устарело и синтаксис подкачал :( , хочется все сделать через "новые технологии" да и разобраться

и borr_1, спасибо за ответы

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 10:19 am

return !vx.GetBool();

GetLong пробовал?

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 10:25 am

а можно как нибудь узнать - возвратилось нормально или не очень? и какого типа?

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 10:47 am

попробовал проинициализировать следующим образом:

Code: Select all

	IDispatch* pDispatch;
	if(::CoCreateInstance(CLSID_WebBrowser,NULL,CLSCTX_INPROC_SERVER,IID_IWebBrowser2, (void**)&pDispatch)!= S_OK){
		m_Correct = false;
		return;
	}
	m_WebBrowser.SetDispatchPtr(pDispatch);

	mp_Container = new wxActiveXContainer(this,IID_IWebBrowser2,pDispatch);
результат тотже:( похоже придется возвращаться к старому:(

но чтото не так с инициализацией, я чувствую

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 10:51 am

Так попробуй

Code: Select all

::CoCreateInstance(
CLSID_InternetExplorer,0,CLSCTX_SERVER,
IID_IWebBrowser2,(void**)&Browser))

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 11:19 am

..\..\src\msw\ole\activex.cpp(865): assert "classInfo.Ok()" failed in wxActiveXContainer::CreateActiveX().

увы... не работает как сказал

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 12:06 pm

У меня вот это компилируется
wxActiveXContainer* mp_Container;
wxAutomationObject m_WebBrowser;

IDispatch* pDispatch;

if(FAILED(::CoCreateInstance(
CLSID_InternetExplorer,0,CLSCTX_SERVER,
IID_IWebBrowser2,(void**)&pDispatch)))
return;
m_WebBrowser.SetDispatchPtr(pDispatch);

mp_Container = new wxActiveXContainer(this,IID_IWebBrowser2,pDispatch);
Но у меня 2.8.9 откомпиленная как dll, а этого патча
http://trac.wxwidgets.org/attachment/ti ... _DLL.patch до сих пор почему то нет -очень странно, хотя он добавлен 14 месяцев назад. И при ленковке все становиться.

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 12:34 pm

а работает? у меня просто не dll а статическая линковка, мультилиб

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 12:41 pm

При линковке валится сборка я ж сказал

И еще что это у тебя за this какой-то подозрительный в строке mp_Container = new wxActiveXContainer(this,IID_IWebBrowser2,pDispatch);

там должен быть объект wxMediaCtrl каой-нибудь

sergiokey
Knows some wx things
Knows some wx things
Posts: 30
Joined: Sat Mar 21, 2009 6:55 am

Post by sergiokey » Thu Apr 09, 2009 1:06 pm

wxActiveXContainer( wxWindow* parent, REFIID iid, IUnknown* pUnk, ) - это по справке
просто я обернул все это дело в контейнер, чтобы просто прицепить к форме

И при ленковке все становиться - не заметил, извини

может посмотришь?
только у меня на vs2008
Attachments
gambling.zip
(156.48 KiB) Downloaded 123 times

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Thu Apr 09, 2009 1:13 pm

А там же в справке пример и в нем

Code: Select all

m_ctrl = wxStaticCast(ctrl, wxMediaCtrl);
m_pAX = new wxActiveXContainer(ctrl,
                    DIID__DPdf,
                    pDispatch);
Смотреть не обещаю извини времени нет тем более мне wxWidgets по любому перекомпилировать придется чтобы wxActiveXContainer заработал.

Post Reply