BHO HtmlEventObject se bloquea

Tengo un objeto de ayuda del navegador escrito en C ++ pero tengo un problema al recibir un OnHelp HtmlEvent.

Cuando intento acceder a un atributo, el navegador se bloquea.

VARIANT_BOOL STDMETHODCALLTYPE OnHelp(IHTMLEventObj2 *pEvtObj)
{
    std::cout << "OnHelp Event" << std::endl;

    if(pEvtObj != NULL) {
        VARIANT var;
        pEvtObj->getAttribute(L"formID", 0, &var);
        std::cout << (char*)var.bstrVal << std::endl;
    } 
    else {
        std::cout << "PELEM = NULL" << std::endl;
    }

    return VARIANT_TRUE;
}

¿Se bloquea en la línea getAttribute por alguna razón? Al hacer esto en C #, funciona perfectamente. Espero que alguien pueda ayudarme a solucionar este problema.

Edit:

El problema real fue con el parámetro que necesitaba para usar IHTMLEventObj y luego consultar IHTMLEventObj2.

VARIANT_BOOL STDMETHODCALLTYPE OnHelp(IHTMLEventObj *pEvtObj)
{
    IHTMLEventObj2 *pEvtObj2;
    pEvtObj->QueryInterface(IID_IHTMLEventObj2, (void**)&pEvtObj2);

    if(pEvtObj2 != NULL) {
        VARIANT var;
        pEvtObj2->getAttribute(CComBSTR(L"url"), 0, &var);
        std::cout << _bstr_t(var.bstrVal) << std::endl;
    } 
    else {
        std::cout << "PELEM = NULL" << std::endl;
    }

    return VARIANT_TRUE;
}

preguntado el 16 de mayo de 11 a las 17:05

Y lea esto antes de continuar con la programación COM: blogs.msdn.com/b/ericlippert/archive/2003/09/12/52976.aspx -

1 Respuestas

El primer argumento para getAttribute es un BSTR, pero estás pasando un wchar_t*/unsigned int * dependiendo de la configuración de compilación de VC.
BSTR es una cadena del sistema que se espera que sea desasignada por el método de recepción.

Trata

#define DOM_ANON_STRING(x)          (_bstr_t(x))
pEvtObj->getAttribute(DOM_ANON_STRING(L"formID"), 0, &var);

contestado el 16 de mayo de 11 a las 23:05

_bstr_t es malvado. Simplemente use un BSTR o CComBSTR. - i_am_jorf

@jeffamaphone: Quizás podrías explicar más sobre tus pensamientos sobre el mal. Creo que no usamos CComBSTR ya que algunos desarrolladores anteriores evitaron CComBSTR debido a los enlaces a MFC, por ejemplo, y el problema original es que no se asigna la memoria correctamente para el BSTR, que es con lo que está ayudando la clase, por lo que decir que usar BSTR no lo hace ' Ayudar. - Greg Domjan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.