Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема 1cpp расширение CAXControl (число прочтений - 1004 )
businka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 15. Января 2020
1cpp расширение CAXControl
15. Января 2020 :: 17:42
Печать  
Добрый день. Есть потребность на форме вывести веб страничку через ActiveX Shell.Explorer.2 и получать события onclick от документа.


Пробую доработать CAXControl чтобы подписаться в нем на события свойства Document из браузера.
Подскажите как добраться до document и подписаться на события, пока не могу добраться и до документа.



Пока новые методы  в  CAXControl не добавлял, просто использую метод CAXCtrlContainer::SetupEventHandlers() в качестве опытов для получения доступа к документу. предполагая что процедура подписки на события будет идентичной.


Код (C++)
Выбрать все
void CAXCtrlContainer::SetupEventHandlers(){
	if(!m_pControl)
		return;
	IProvideClassInfoPtr pPCI = m_pControl->GetControlUnknown();
	if(pPCI==NULL)
		return;

	IDispatch *pWebBrowser;
	HRESULT hr = pPCI->QueryInterface(IID_IWebBrowser2, (void**)&pWebBrowser);

	IDispatch *pDispDoc;
	if (SUCCEEDED(hr))
	{
		int j = 1;
		hr = pWebBrowser->get_Document(&pDispDoc);
		if (SUCCEEDED(hr)){
			int i = 1;
		}
	}

 


C:\1cpp\1cpp\Source\AXControl.cpp(xxx) : error C2039: 'get_Document' : is not a member of 'IDispatch'
  
Наверх
 
IP записан
 
businka
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 2
Зарегистрирован: 15. Января 2020
Re: 1cpp расширение CAXControl
Ответ #1 - 17. Января 2020 :: 13:59
Печать  
до документа добрался, как подписаться почти разобрался. если кто то готов реализовать, помочь реализовать готов денежку заплатить
Код (C++)
Выбрать все
BOOL CAXControl::methAddPropertyEventHandling(CValue &RetVal, CValue **params)
{
	if(!m_pCtrlCnt)
	{
		RuntimeError("Íå çàäàí ðîäèòåëüñêèé ýëåìåíò óïðàâëåíèÿ");
		return FALSE;
	}
	CString className=params[0]->GetString();
	className.TrimRight();
		if(!m_pCtrlCnt->m_pControl)
		return FALSE;


	IProvideClassInfoPtr iUnkControl=m_pCtrlCnt->m_pControl->GetControlUnknown();
	iUnkControl->AddRef();

	if(iUnkControl==NULL)
		return FALSE;


	//*********************
	// Ïîëó÷àåì ñâîéñòâî Document
	IDispatch *idispWebBrowser;
	HRESULT hresult = iUnkControl->QueryInterface(IID_IWebBrowser2, (void**)&idispWebBrowser);

	if (FAILED(hresult))
		return FALSE;
	DISPID id;
	OLECHAR * name = L"Document";
	hresult = idispWebBrowser->GetIDsOfNames(
	   IID_NULL,
	   &name,
	   1, LOCALE_USER_DEFAULT,
	   &id);

	if (FAILED(hresult))
		return FALSE;

	VARIANT result;

	DISPPARAMS dp = {NULL, NULL, 0, 0};
	hresult = idispWebBrowser->Invoke(
		id,
		IID_NULL,
		LOCALE_USER_DEFAULT,
		DISPATCH_PROPERTYGET,
		&dp,
		&result,
		NULL,
		NULL
		);
	if (FAILED(hresult))
		return FALSE;


	IDispatch * idispDocument;
	if (result.ppdispVal == 0 || result.vt != VT_DISPATCH)
		return FALSE;

	idispDocument = V_DISPATCH(&result);
	idispDocument->AddRef();

	IProvideClassInfoPtr iProvideClassInfoDocument;
	hresult = idispDocument->QueryInterface(IID_IProvideClassInfo, (void**)&iProvideClassInfoDocument);


	IHTMLDocument2Ptr htmlDocument;
	hresult = idispDocument->QueryInterface(IID_IHTMLDocument2, (void**)&htmlDocument);
	if (FAILED(hresult))
		return FALSE;

	CAXDocumentEventHandler htmlDocumentEventHandler1 = CAXDocumentEventHandler(m_pCtrlCnt);
	htmlDocumentEventHandler = &htmlDocumentEventHandler1;

	VARIANT variantOnClick;
	variantOnClick.vt = VT_DISPATCH;
	variantOnClick.pdispVal = htmlDocumentEventHandler;
	hresult = htmlDocument->put_onclick(variantOnClick);



//	ClickEvents clickEvents1 = ClickEvents(m_pCtrlCnt);
//	clickEvents = &clickEvents1;
//	_variant_t clickDispatch;
//	clickDispatch.vt = VT_DISPATCH;
//	clickDispatch.pdispVal = clickEvents;

//	hresult = htmlDocument->put_onclick(clickDispatch);

	if (FAILED(hresult))
		return FALSE;

}
 

  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать