Compartir a través de


Llamar a funciones e interfaces de shell desde un apartamento multiproceso

Cuando llama a una función de shell o accede a una interfaz de shell desde un subproceso que se ha inicializado como un apartamento de subprocesos múltiples, es posible que la función o la interfaz tengan su funcionalidad dañada o fallen por completo.

Versión original: Shell e interfaz de Windows
Número de KB original: 287087

Causa

Una llamada a CoInitializeEx (COINIT_MULTITHREADED) permite que las llamadas a objetos creados en el subproceso que realiza la llamada se ejecuten en cualquier subproceso. Al acceder a los objetos que usan el modelo de subprocesos de apartamento desde un apartamento multiproceso, COM sincronizará el acceso al objeto. Para que se produzca esta sincronización, COM debe encaminar las llamadas al objeto. Dado que el shell no proporciona actualmente la información necesaria, ya sea a través de una biblioteca de tipos o código proxy/código auxiliar, para que sus objetos se serializarán, se producirá un error en los intentos de obtener acceso a objetos de shell desde un apartamento multiproceso.

Llamadas que pueden afectar a las funciones del shell

A continuación se muestran ejemplos de cómo las llamadas a CoInitializeEx (COINIT_MULTITHREADED) pueden afectar las funciones que dependen de objetos shell.

  • GetOpenFileName/GetSaveFileName

    Los usuarios pueden navegar a carpetas de extensión de nombres, como Mis documentos, a través del cuadro de diálogo Abrir y Guardar Como. Sin embargo, estas carpetas no se pueden examinar porque el explorador no puede crear las interfaces necesarias, como IShellFolder.

  • ShellExecute/ShellExecuteEx

    ShellExecuteLos hooks se pueden escribir para ampliar la funcionalidad de ShellExecute o ShellExecuteEx mediante la implementación de la interfaz IShellExecuteHook. Cuando se llama a ShellExecute o ShellExecuteEx, no se pueden cargar hooks registrados ShellExecute.

En ambos ejemplos, el componente que intenta obtener un puntero de interfaz a un objeto de shell con CoCreateInstance, IUnknown::QueryInterface, y demás, normalmente fallará con el error E_NOINTERFACE cuando se llama desde apartamentos multiproceso. El motivo, como se indicó anteriormente, es que no hay información de tipo ni código auxiliar o proxy para los objetos que se solicitan.

Referencias

Proceso, hilos y apartamentos