Pregunta

I sabe un (++ vc) OCX es un control ActiveX, y un (vc ++) DLL es una colección de funciones. He descubierto que se llama desde una aplicación de vb.net, la captura de algunas excepciones podría comportarse de manera diferente si la excepción está siendo lanzada desde el interior del OCX o dentro de una función que viene en una DLL.

Así que mi pregunta es: Desde el punto de vista de una aplicación VB.net, ¿cuáles son las principales diferencias entre el uso de archivos .ocx y uso de archivos .dll?

¿Fue útil?

Solución

Una DLL es una biblioteca compartida. Es un objeto de nivel OS -. Todo proceso puede cargar un archivo DLL y llamadas funciones definidas en ella

Un control ActiveX es un objeto COM que implementa las interfaces específicas que permite a los hosts para llamar a sus métodos e incrustarlo en su interfaz de usuario. Hay ciertos requisitos mínimos en qué interfaz de un control ActiveX debe implementar para ser integrado con éxito en la interfaz de usuario de una aplicación. Dado que los objetos COM están típicamente cargados dinámicamente por un proceso, que se implementan como un DLL. Un solo archivo DLL puede implementar una clase COM o más.

En cuanto a las excepciones - no estoy seguro de lo que ha observado diferencias, sino una función no es diferente de una función implementada en el archivo .EXE principal de su proceso. Una excepción lanzada en ella debe propagar normalmente de acuerdo con las reglas definidas por el entorno de ejecución de su lenguaje de programación.

método

Un ActiveX es diferente. Por lo general, se llama a través de algo que se llama una interfaz IDispatch. En lugar de ser una simple llamada de subrutina, se invoca llamando a un método en el interfaz IDispatch (IDispatch :: Invoke), con sus argumentos calculan de una manera específica (en esencia, son convertidos a los tipos estándar y se empaquetan de manera que los cueros diferencias en convenciones de llamada y tipos de datos entre el lenguaje de implementación del proceso principal y la del control ActiveX.) IDispatch :: Invoke interfaz a continuación determina el método en el ActiveX de la persona que llama está tratando de acceso y rutas directamente.

Excepciones generalmente no se propagan a través de la interfaz IDispatch. Cómo sus ofertas de tiempo de ejecución de entorno con los códigos de error devueltos por IDispatch :: Invokeis hasta el implementador para decidir, de verdad. Por lo que razonablemente se puede esperar no tener sus expectativas conocido cuando se trata de errores de ejecución y las excepciones lanzadas en un control ActiveX.

Otros consejos

Una .ocx contiene coclases COM que siguen el contrato de automatización OLE. Ese contrato tiene una forma bien definida para devolver errores a un cliente. Cada método devuelve un HRESULT, un código que indica si el método tuvo éxito o no. Es un simple número entero, códigos de error se definen en el archivo de cabecera Winerror.h SDK. También es compatible con obtener información contextual sobre el error a través de la interfaz de IErrorInfo. El soporte de interoperabilidad COM en los asegura CLR que un código de error se traduce en una Excepción comparable.

No existe tal estándar para el código en el DLL de C / C ++. Si se produce una excepción en absoluto, es casi siempre algo desagradable como un AccessViolation. El contador de referencias P / Invoke se asegura de estas excepciones son capturados y traducidos. Usted siempre obtiene información muy poco útil de tal excepción más allá de "no funcionó". Usted debe dejar a estas excepciones finalizar su programa, puede recuperar no significativa de ella.

No hay ninguna diferencia. Ambos son dlls. Puede cambiar el nombre de un archivo DLL para nada y todavía cargar y utilizarla mediante LoadLibrary, GetProcAddress.

En el mundo .NET, un DLL no es una colección de funciones. Se trata de un montaje, que es una colección de tipos - clases y módulos. Esos tipos probablemente también contienen funciones, pero eso es un nivel diferente de abstracción.

Pero ya que estamos hablando de esto en conjunto con OCX voy a conceder que a lo mejor usted se refiere a una DLL creado por VB6, ya .Net no tiene nada que ver con los archivos OCX o ActiveX control directo . En ese caso, se trata de objetos COM ambos sólo se puede cargar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top