Sincronización de llamadas
Las aplicaciones COM deben ser capaces de tratar correctamente la entrada del usuario mientras se procesan una o varias llamadas desde COM o el sistema operativo. COM proporciona sincronización de llamadas solo para apartamentos de un solo subproceso. Los apartamentos multiproceso (que contienen subprocesos libres) no reciben llamadas al realizar llamadas (en el mismo subproceso). Los apartamentos multiproceso no pueden realizar llamadas sincronizadas de entrada. Las llamadas asincrónicas se convierten en llamadas sincrónicas en apartamentos multiproceso. No se llama al filtro de mensajes para ningún subproceso en un apartamento multiproceso. Para obtener más información sobre los problemas de subproceso, vea Procesos, Subprocesos y Apartamentos.
Las llamadas COM entre procesos se dividen en tres categorías, como se indica a continuación:
-
Llamadas sincrónicas
-
La mayor parte de la comunicación que tiene lugar dentro de COM es sincrónica. Al realizar llamadas sincrónicas, el llamador espera la respuesta antes de continuar y puede recibir mensajes entrantes mientras espera. COM entra en un bucle modal para esperar la respuesta, recibir y enviar otros mensajes de forma controlada.
-
Notificaciones asincrónicas
-
Al enviar notificaciones asincrónicas, el autor de la llamada no espera la respuesta. COM usa PostMessage o eventos de alto nivel para enviar notificaciones asincrónicas, en función de la plataforma. COM define cinco métodos asincrónicos de IAdviseSink:
Nota
Aunque COM está procesando una llamada asincrónica, no se pueden realizar llamadas sincrónicas. Por ejemplo, la implementación de una aplicación contenedora de OnDataChange no puede contener una llamada a IPersistStorage::Save. Estas llamadas son las únicas llamadas asincrónicas compatibles con COM. No hay ninguna manera de crear una interfaz personalizada asincrónica en este momento.
-
Llamadas sincronizadas por entrada
-
Al realizar llamadas sincronizadas de entrada, el objeto llamado debe completar la llamada antes de producir el control. Esto ayuda a garantizar que la administración de foco funciona correctamente y que los datos introducidos por el usuario se procesan correctamente. Estas llamadas se realizan mediante COM a través de la función SendMessage , sin entrar en un bucle modal. Al procesar una llamada sincronizada con entrada, el objeto llamado no debe llamar a ninguna función o método (incluidos los métodos sincrónicos) que puedan producir el control. Los métodos siguientes están sincronizados de entrada
- IOleWindow::GetWindow
- IOleInPlaceActiveObject::OnFrameWindowActivate
- IOleInPlaceActiveObject::OnDocWindowActivate
- IOleInPlaceActiveObject::ResizeBorder
- IOleInPlaceUIWindow::GetBorder
- IOleInPlaceUIWindow::RequestBorderSpace
- IOleInPlaceUIWindow::SetBorderSpace
- IOleInPlaceFrame::SetMenu
- IOleInPlaceFrame::SetStatusText
- IOleInPlaceObject::SetObjectRects
Para minimizar los problemas que pueden surgir del procesamiento de mensajes asincrónicos, la mayoría de las llamadas de método COM son sincrónicas. Con la comunicación sincrónica, no es necesario que el código especial envíe y controle los mensajes entrantes. Cuando una aplicación realiza una llamada de método sincrónico, COM entra en un bucle de espera modal que controla las respuestas necesarias y envía los mensajes entrantes a las aplicaciones capaces de procesarlos.
COM administra las llamadas de método mediante la asignación de un identificador denominado identificador de subproceso lógico. Se asigna uno nuevo cuando un usuario selecciona un comando de menú o cuando la aplicación inicia una nueva operación COM. Las llamadas posteriores relacionadas con la llamada COM inicial se asignan el mismo identificador de subproceso lógico que la llamada inicial.