2014-12-14 8 views
1

Добрый день, у меня проблема с вспомогательным объектом браузера для интернет-исследователя. Мне нужно перезвонить на код 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, &params, 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, &params, 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, &params, 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

+0

Это сообщение об ошибке «не работает». Вам нужно будет улучшить его, чтобы вы знали, почему это не удалось. HRESULT hr = dispxWnd-> Invoke (..); if (FAILED (hr)) {...} –

+0

У меня есть русский os, смысл сообщения что-то вроде «член группы не найден», шестнадцатеричный код ошибки 80020003 – sss123next

+0

Создали ли вы библиотеку типов для своего модуля? [Вот сообщение в блоге] (http://jeffcode.blogspot.com/2008/02/how-to-create-activex-control-that.html) Я написал давно, что объясняет, как идти другим путем вы можете найти это полезным. –

ответ

0

вы получаете динамический DISPID с IDispatchEx::GetDispID который должен работать с IDispatchEx::InvokeEx, но тогда вы предоставляете его IDispatch::Invoke, который должен работать со статическими идентификаторами DispId возвращаемых IDIspatch::GetIDsOfNames ,


PS: Я также найти следующую строку интересное:

CComVariant varMyBho((IDispatch*)local_data.tabs[(ptr_type)browser].bho); 

Являются ли эти действительно все IDispatch указатели? Или они IUnknown указатели? Если последний, то вы должны QueryInterface.

+0

спасибо за ответ, я проверю его, и да, все члены .bho такие же и IDispatch реализовано – sss123next

+0

Я могу опубликовать упрощенную выборку моего bho с этой реализованной логической логикой – sss123next

+0

проверено, тот же результат, я загрузил упрощенный образец из этого bho (с IDispatchEx :: Invoke) http://sss.chaoslab.ru/code_.7z – sss123next