Precauciones de función de enlace de In-Context
Por motivos de rendimiento, los desarrolladores cliente registran funciones de enlace en contexto. Sin embargo, dado que estas funciones de enlace se asignan al espacio de direcciones del servidor, los desarrolladores de cliente y servidor deben tomar precauciones para asegurarse de que el procesamiento de eventos se realice sin problemas.
Precauciones para desarrolladores de cliente
Los desarrolladores cliente deben tener en cuenta los siguientes problemas:
- Las funciones de enlace en contexto no deben usar mucho tiempo de procesador, ya que la función de enlace debe devolverse antes de que la aplicación del servidor continúe.
- Una vez desencadenado un evento, es posible que la ventana asociada a un evento ya no exista en el momento en que se llama a la función de enlace. Los clientes deben comprobar que la ventana asociada a un evento sigue existiendo antes de realizar cualquier otra acción relacionada con el evento. Para asegurarse de que todavía existe una ventana, los clientes usan la función IsWindow de Microsoft Win32.
- Si el archivo DLL en el que se define la función de enlace está vinculado a otro archivo DLL, los desarrolladores cliente deben asegurarse de que el sistema carga el otro archivo DLL. Si vincula implícitamente (mediante archivos .def e importaciones), el archivo DLL adicional debe estar en el directorio de Windows o en uno de los directorios del sistema, como Windows\System, Windows\System32 o Windows\SysWOW64. Si vincula explícitamente (mediante LoadLibrary), la ruta de acceso completa al directorio en el que reside el archivo DLL adicional debe especificarse en la llamada a LoadLibrary.
- Las funciones de enlace en contexto pueden provocar un desbordamiento de pila cuando el archivo DLL que contiene la función de enlace se carga en una aplicación de 16 bits. Este problema se produce porque las aplicaciones de 16 bits usan un tamaño fijo de pila que no es lo suficientemente grande como para dar cabida a la cadena de llamadas de función del sistema que dan lugar a una llamada a la función de enlace.
Precauciones para desarrolladores de servidores
Los desarrolladores de servidores deben tener en cuenta que las aplicaciones cliente pueden registrar funciones de enlace en contexto. Cuando un servidor llama a NotifyWinEvent, debe estar preparado para controlar WM_GETOBJECT y otros métodos IAccessible .
Punteros de interfaz no válidos
Cuando un cliente llama a AccessibleObjectFromEvent dentro de una función de enlace en contexto, el puntero de interfaz IAccessible que se devuelve apunta directamente al código en el espacio de direcciones del servidor. Si el cliente llama a una propiedad de interfaz mediante este puntero, la biblioteca del Modelo de objetos componentes (COM) no está implicada en la serialización (empaquetado y envío de parámetros de interfaz a través de los límites del proceso) o descomprimir (desempaquetar parámetros que se han enviado a través de los límites del proceso) y no detecta si se destruye un objeto.
Si el cliente llama a una propiedad de interfaz a un objeto que se destruye, el puntero de interfaz no válido provoca un error de Protección general en el espacio de direcciones del servidor a menos que el servidor detecte esta situación.
Para protegerse frente a punteros de interfaz no válidos, los servidores crean objetos proxy que encapsulan objetos accesibles y supervisan el período de vida de los objetos accesibles. Por ejemplo, cuando un cliente llama a una propiedad IAccessible para obtener información sobre un objeto, el proxy comprueba si el objeto accesible sigue estando disponible y, si es así, reenvía la solicitud del cliente al objeto accesible. Si se destruye el objeto accesible, el proxy devuelve un error al cliente.