Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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
ShellExecute
Los hooks se pueden escribir para ampliar la funcionalidad deShellExecute
oShellExecuteEx
mediante la implementación de la interfazIShellExecuteHook
. Cuando se llama aShellExecute
oShellExecuteEx
, no se pueden cargar hooks registradosShellExecute
.
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.