Dela via


Anropa shell-funktioner och gränssnitt från en flertrådad lägenhet

När du anropar eller får åtkomst till en shell-funktion eller ett shell-gränssnitt från en tråd som har initierats som en multitrådad lägenhet kan funktionaliteten hos funktionen eller gränssnittet bli nedsatt eller helt misslyckas.

Ursprunglig version: Windows-skalet och -gränssnittet
Ursprungligt KB-nummer: 287087

Orsak

Med ett anrop till CoInitializeEx (COINIT_MULTITHREADED) kan anrop till objekt som skapats i den anropande tråden köras på valfri tråd. När du kommer åt objekt som använder lägenhetstrådsmodellen från en flertrådad lägenhet synkroniserar COM åtkomsten till objektet. För att den här synkroniseringen ska ske måste COM hantera anrop till objektet. Eftersom skalet för närvarande inte tillhandahåller nödvändig information, antingen via ett typbibliotek eller proxy/stub-kod, för att objekten ska överföras, misslyckas försök att komma åt skalobjekt från en flertrådad lägenhet.

Anrop som kan påverka shell-funktioner

Följande är exempel på hur anrop till CoInitializeEx (COINIT_MULTITHREADED) kan påverka funktioner som förlitar sig på gränssnittsobjekt:

  • GetOpenFileName/GetSaveFileName

    Användare kan navigera till namnområdestilläggsmappar som Mina dokument via dialogrutan Öppna och Spara som . Dessa mappar kan dock inte bläddras till eftersom webbläsaren inte kan skapa de nödvändiga gränssnitten, till exempel IShellFolder.

  • ShellExecute/ShellExecuteEx

    ShellExecute kan skrivas för att utöka funktionaliteten i antingen ShellExecute eller ShellExecuteEx genom att implementera gränssnittet IShellExecuteHook. När ShellExecute eller ShellExecuteEx anropas kan registrerade ShellExecute krokar inte laddas.

I båda dessa exempel misslyckas vanligtvis komponenten som försöker hämta en gränssnittspekare till ett skalobjekt med CoCreateInstance, IUnknown::QueryInterface och så vidare, med fel E_NOINTERFACE när den anropas från flertrådade miljöer. Anledningen, som nämnts ovan, är att det inte finns någon typinformation eller proxy/stub-kod för de objekt som begärs.

Referenser

Processer, trådar och komponentlägenheter