Добрый день, у меня проблема с вспомогательным объектом браузера для интернет-исследователя. Мне нужно перезвонить на код C++ из кода js с кодом, поэтому я должен экспортировать некоторые методы C++ в js-код. Я нашел метод через IDispatchEx::Invoke
, но этот метод постоянно терпит неудачу для некоторых сайтов.ie bho IDispatchEx :: Invoke failure
void __stdcall CEventSink::DocumentComplete(IDispatch *pObject, VARIANT *pvarUrl)
{
if(pObject)
{
IServiceProvider *pSp = NULL;
if(SUCCEEDED(pObject->QueryInterface(IID_IServiceProvider, (void**)&pSp)))
{
IWebBrowser2 *browser = NULL;
if(SUCCEEDED(pObject->QueryInterface(IID_IWebBrowser2, (void**)&browser)))
{
IDispatch *disp = NULL;
if(SUCCEEDED(browser->get_Document(&disp)))
{
IHTMLDocument2 *doc = NULL;
if(SUCCEEDED(disp->QueryInterface(IID_IHTMLDocument2, (void**)&doc)))
{
IHTMLWindow2 *w = NULL;
if(SUCCEEDED(doc->get_parentWindow(&w)))
{
CComPtr<IDispatchEx> dispxWnd;
if(local_data.tabs[(ptr_type)browser].bho)
{
if(SUCCEEDED(w->QueryInterface(&dispxWnd)))
{
CComBSTR propName(L"cbx");
DISPID dispid;
if(SUCCEEDED (dispxWnd->GetDispID(propName, fdexNameEnsure, &dispid)))
{
CComVariant varMyBho((IDispatch*)local_data.tabs[(ptr_type)browser].bho);
DISPID dummy[] = {DISPID_PROPERTYPUT};
DISPPARAMS params;
params.cArgs = 1;
params.cNamedArgs = 0;
params.rgvarg = &varMyBho;
params.rgdispidNamedArgs = NULL;
if(FAILED(dispxWnd->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF, ¶ms, NULL, NULL, NULL)))
{
MessageBoxA(NULL, "failed to dispxWnd->Invoke", "", MB_OK);
//TODO: handle error
}
}
Это провал по вызову if(FAILED(dispxWnd->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF, ¶ms, NULL, NULL, NULL)))
, но только для некоторых сайтов, tee-links.com, например. local_data.tabs[(ptr_type)browser].bho
хранится указатель на экземпляр класса с реализованными интерфейсами. как это было предложено первым комментарий а добавили некоторый код, чтобы получить некоторую информацию об ошибке, быстро и грязно
HRESULT hr = dispxWnd->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUTREF, ¶ms, NULL, NULL, NULL);
if(FAILED(hr))
{
_com_error err(hr);
LPCTSTR msg = err.ErrorMessage();
char errnum[32];
_snprintf(errnum, 31, "%x", hr);
MessageBox(NULL, msg, to_utf16(errnum).c_str(), MB_OK);
поэтому у нас есть сообщения об ошибке что-то вроде «член группы не найден», я установил так русский ОС не может точно сказать, и код ошибки 80020003
Это сообщение об ошибке «не работает». Вам нужно будет улучшить его, чтобы вы знали, почему это не удалось. HRESULT hr = dispxWnd-> Invoke (..); if (FAILED (hr)) {...} –
У меня есть русский os, смысл сообщения что-то вроде «член группы не найден», шестнадцатеричный код ошибки 80020003 – sss123next
Создали ли вы библиотеку типов для своего модуля? [Вот сообщение в блоге] (http://jeffcode.blogspot.com/2008/02/how-to-create-activex-control-that.html) Я написал давно, что объясняет, как идти другим путем вы можете найти это полезным. –