Synchronizace volání
Aplikace modelu COM musí být schopny správně pracovat se vstupem uživatele při zpracování jednoho nebo více volání z modelu COM nebo operačního systému. Com poskytuje synchronizaci volání pouze pro jednovláknové apartmány. Vícevláknové apartmány (obsahující vlákna s volným vláknem) nepřistávají volání při volání (ve stejném vlákně). Vícevláknové apartmány nemohou provádět vstupní synchronizovaná volání. Asynchronní volání se převedou na synchronní volání v vícevláknových apartmánech. Filtr zpráv není volán pro žádné vlákno v vícevláknovém bytě. Další informace o problémech s vlákny naleznete v tématu Procesy, vlákna a apartmány.
Volání modelu COM mezi procesy spadají do tří kategorií:
-
synchronní volání
-
Většina komunikace, která probíhá v modelu COM, je synchronní. Když provádíte synchronní volání, volající před pokračováním čeká na odpověď a během čekání může přijímat příchozí zprávy. Com zadá modální smyčku, která bude čekat na odpověď, příjem a odesílání jiných zpráv řízeným způsobem.
-
asynchronních oznámení
-
Při odesílání asynchronních oznámení volající nečeká na odpověď. Com používá PostMessage nebo události vysoké úrovně k odesílání asynchronních oznámení v závislosti na platformě. Com definuje pět asynchronních metod IAdviseSink:
Poznámka
Zatímco com zpracovává asynchronní volání, synchronní volání nelze provést. Například implementace aplikace kontejneru OnDataChange nemůže obsahovat volání IPersistStorage::Save. Tato volání jsou jediná asynchronní volání podporovaná modelem COM. Neexistuje způsob, jak vytvořit vlastní rozhraní, které je v tuto chvíli asynchronní.
-
volání synchronizovaná se vstupem
-
Při provádění vstupně-synchronizovaných volání, objekt musí volání dokončit před provedením řízení. To pomáhá zajistit, aby správa fokusu fungovala správně a aby byla data zadaná uživatelem zpracována odpovídajícím způsobem. Tato volání provádí COM prostřednictvím funkce SendMessage, aniž byste museli zadávat modální smyčku. Při zpracování vstupního synchronizovaného volání nesmí objekt volat žádnou funkci ani metodu (včetně synchronních metod), které by mohly přinést kontrolu. Následující metody jsou synchronizované se vstupem.
- IOleWindow::GetWindow
- IOleInPlaceActiveObject::OnFrameWindowActivate
- IOleInPlaceActiveObject::OnDocWindowActivate
- IOleInPlaceActiveObject::ResizeBorder
- IOleInPlaceUIWindow::GetBorder
- IOleInPlaceUIWindow::RequestBorderSpace
- IOleInPlaceUIWindow::SetBorderSpace
- IOleInPlaceFrame::SetMenu
- IOleInPlaceFrame::SetStatusText
- IOleInPlaceObject::SetObjectRects
Pro minimalizaci problémů, které mohou vzniknout z asynchronního zpracování zpráv, je většina volání metody COM synchronní. Při synchronní komunikaci není potřeba speciální kód odesílat a zpracovávat příchozí zprávy. Když aplikace provede synchronní volání metody, com zadá modální čekací smyčku, která zpracovává požadované odpovědi a odesílá příchozí zprávy do aplikací, které je dokážou zpracovat.
COM spravuje volání metod přiřazením identifikátoru nazývaného ID logického vlákna. Nový se přiřadí, když uživatel vybere příkaz nabídky nebo když aplikace zahájí novou operaci MODELU COM. Následná volání, která souvisejí s počátečním voláním modelu COM, mají přiřazené stejné ID logického vlákna jako počáteční volání.