Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Elk proces dat COM gebruikt, moet zowel de COM-bibliotheek initialiseren als ook weer de-initialiseren. Naast een specificatie implementeert COM ook enkele belangrijke services in deze bibliotheek. Geleverd als een set DLL's en EX's (voornamelijk Ole32.dll en Rpcss.exe) in Microsoft Windows, bevat de COM-bibliotheek het volgende:
Een klein aantal fundamentele functies waarmee com-toepassingen, zowel client als server, kunnen worden gemaakt. Voor clients levert COM basisfuncties voor het maken van objecten. Voor servers levert COM de middelen voor het blootstellen van hun objecten.
Services voor het lokaliseren van implementaties waarmee COM op basis van een unieke klasse-id (CLSID) bepaalt welke server die klasse implementeert en waar die server zich bevindt. Deze service biedt ondersteuning voor een indirectielaag, doorgaans een systeemregister, tussen de identiteit van een objectklasse en de manier waarop de implementatie is verpakt, zodat clienttoepassingen onafhankelijk zijn van die verpakking, die in de toekomst kan veranderen.
Transparante externe procedure roept aan wanneer een object wordt uitgevoerd op een lokale of externe server.
Een standaardmechanisme waarmee een toepassing kan bepalen hoe geheugen wordt toegewezen binnen het proces, met name geheugen dat moet worden doorgegeven tussen samenwerkende objecten, zodat deze correct kan worden vrijgemaakt.
Als u eenvoudige COM-services wilt gebruiken, moeten alle COM-threads van uitvoering in clients en out-of-process-servers de CoInitialize - of CoInitializeEx-functie aanroepen voordat u een andere COM-functie aanroept, met uitzondering van geheugentoewijzingsoproepen. CoInitializeEx vervangt de andere functie en voegt een parameter toe waarmee u het threadingmodel van de thread kunt opgeven: apartment-threaded of free-threaded. Een aanroep van CoInitialize stelt slechts het threading-model in op apartment-threaded.
OLE samengestelde documenttoepassingen roepen de functie OleInitialize aan , die CoInitializeEx aanroept en ook enige initialisatie vereist voor samengestelde documenten. Daarom kunnen threads die OleInitialize aanroepen, niet gratis threads bevatten. Zie Processen, Threads en Apartments voor informatie over threads in clients en servers.
In-process servers roepen de initialisatiefuncties niet aan, omdat ze worden geladen in een proces dat dit al heeft gedaan. Als gevolg hiervan moeten in-processervers hun threadingmodel instellen in het register onder de InprocServer32-sleutel . Zie Threadingproblemen in in-process-servers voor gedetailleerde informatie.
Het is ook belangrijk om de bibliotheek niet te initialiseren. Voor elke aanroep naar CoInitialize of CoInitializeEx moet er een overeenkomende aanroep van CoUninitialize zijn. Voor elke aanroep van OleInitialize moet er een overeenkomstige aanroep van OleUninitialize zijn.
In-process servers kunnen ervan uitgaan dat het proces waarin ze worden geladen, deze stappen al heeft uitgevoerd.
Important
Elke thread die COM gebruikt, moet CoInitializeEx aanroepen voordat een andere COM-functie wordt aangeroepen. Dit is de meest voorkomende COM-initialisatiefout: het aanroepen CoCreateInstance of andere COM-API's op een thread die niet is geïnitialiseerd, mislukt met CO_E_NOTINITIALIZED (0x800401F0).
Tip
Aanbevolen patroon — gebruik een RAII-guard om de de-initialisatie te waarborgen:
#include <wil/com.h> // Windows Implementation Libraries
// wil::unique_couninitialize_call calls CoUninitialize automatically on scope exit
auto comInit = wil::CoInitializeEx(COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
// ... use COM — CoUninitialize is called when comInit goes out of scope,
// even if an exception is thrown ...
Als wil niet beschikbaar is, moet u handmatig bellen CoUninitialize() : elke geslaagde CoInitializeEx oproep moet worden gekoppeld aan precies één CoUninitialize oproep:
HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
if (FAILED(hr)) return hr;
// ... use COM ...
CoUninitialize();
Important
Algemene fouten:
- COM-functies aanroepen zonder COM te initialiseren op de huidige thread.
- Niet-overeenstemmende
CoInitializeEx/CoUninitializeaanroepen (elke geslaagde init vereist precies één uninit). - Het combineren van apartment-threadingmodellen op dezelfde thread (het aanroepen van
CoInitializeExmet een ander model dan een eerdere geslaagde aanroep geeftRPC_E_CHANGED_MODEterug).
Verwante onderwerpen