Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

247
Vistas
¿Por qué puedo enviar un objeto COM a una interfaz incorrecta?

Tengo un programa .NET que interactúa con un objeto mshtml de otro proceso. Escribí un pequeño proyecto de muestra desde cero para ilustrar el problema. En este ejemplo, uso directamente una referencia COM para la interoperabilidad de mshtml.

 HTMLDocument document = Document; IHTMLElement activeElement = document.activeElement; Log.Verbose(activeElement.tagName); bool isHtmlFrameElement = activeElement is HTMLFrameElement; Log.Verbose("active Element is " + (isHtmlFrameElement ? "" : "NOT ") + "a frame element");

Hago referencia a un mshtml personalizado, generado con la siguiente llamada:

 tlbimp c:\Windows\System32\mshtml.tlb /out:c:\tmp\Interop.mshtml.dll

En mi máquina de desarrollo (donde está instalado Office), obtengo este registro, que es el comportamiento esperado:

 INPUT active Element is NOT a frame element

Pero en una máquina desnuda , donde no está instalada ninguna oficina (y ninguna interoperabilidad de mshtml), obtengo el siguiente registro:

 INPUT active Element is a frame element

Por supuesto, no es un HTMLFrameElement y cualquier acceso a uno de sus miembros provoca una excepción de miembro no encontrado .

¿Por qué COM permite esta conversión no válida en el segundo escenario? ¿Puedo trabajar con mi interoperabilidad (en el directorio de compilación) o tengo que instalarlo en GAC (como lo hace MS Office)?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

La conversión no falla porque el objeto devuelto es NULL. Los detalles se explican aquí

En breve, dice que no hay excepciones mientras se lanza incorrectamente. Para ser honesto, trabajar con objetos COM no es lo más fácil. En primer lugar, dll debe registrarse correctamente, en segundo lugar, los objetos deben describirse correctamente.

over 4 years ago · Santiago Trujillo Denunciar

0

HTMLFrameElement de HTMLFrameElement es una coclase COM generada por .NET. En realidad y para abreviar, esto no existe más allá de herramientas (como tlbimp, etc.). Por lo general, solo usamos su GUID (el CLSID) para poder "cocrearlo".

Esta coclase declara que implementa DispHTMLFrameElement , que es un dispinterface . Nuevamente, estos son más metadatos para herramientas, no tienen un uso real en su caso. Puede verlo declarado en mshtml.h de Windows SDK:

EXTERN_C const IID DIID_DispHTMLFrameElement;

#si está definido(__cplusplus) && !definido(INTERFAZ)

 MIDL_INTERFACE("3050f513-98b5-11cf-bb82-00aa00bdce0b") DispHTMLFrameElement : public IDispatch { };

#else /* interfaz de estilo C */

Entonces, .NET crea algunas clases sofisticadas sobre estas, pero no deben usarse para detectar el soporte de interfaces COM en su caso. Por qué el comportamiento es diferente según el contexto solo significa que la implementación de estas clases varía.

En su caso, debe consultar con IHTMLFrameElement que también se define en MsHTML.h:

EXTERN_C const IID IID_IHTMLFrameElement;

#si está definido(__cplusplus) && !definido(INTERFAZ)

 MIDL_INTERFACE("3050f313-98b5-11cf-bb82-00aa00bdce0b") IHTMLFrameElement : public IDispatch { public: virtual /* [id][propput] */ HRESULT STDMETHODCALLTYPE put_borderColor( /* [in] */ VARIANT v) = 0; virtual /* [id][propget] */ HRESULT STDMETHODCALLTYPE get_borderColor( /* [out][retval] */ __RPC__out VARIANT *p) = 0; };

#else /* interfaz de estilo C */

Tenga en cuenta que el IID es similar pero, de hecho, diferente y probar con este es realmente lo que quiere hacer:

 bool isHtmlFrameElement = activeElement is IHTMLFrameElement;
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda