|
Um Com STA Interface Pointer über Apartment und Thread Grenzen hinweg benutzten zu können, ist eine recht einfache Lösung die Global Interface Table. Ich möchte hier eine paar Code Schnipsel vorstellen um das Handling mit der GIT zu demonstrieren. Gehen wir davon aus, wir haben ein Com Objekt, welches wir sehr oft an allen möglichen Stellen ( Threads, Apartments ) im Code verwenden möchten.Um dies zu realisieren starte ich meistens ein eigenen Thread der ein MTA initialisiert. Dann erzeuge ich das gewünschte Objekt und registriere es in der GIT wie folgt. Dieser Thread muss natürlich beim Programmstart erzeugt werden und erst beim Programmende beendet werden. Er hält auch die Instanz des Objektes. Helper Thread: CComPtr<IImportantObject> pMyObject; if(!SUCCEEDED( pMyObject.CoCreateInstance( CLSID_ImportantObject ) ) ) { // error handling7 } CComGITPtr<IImportantObject> pMyObjectGIT( pMyObject ); DWORD cookie = pMyObjectGIT.GetCookie();
Um nun irgendwo auf das Objekt zugreifen zu können, müssen wir lediglich das Cookie kennen. Das es ein einfaches DWORD ist, kann man es problemlos zwischen Threads hin und her kopieren. Main Thread / Yet Another Thread: CComGITPtr<IImportantObject> pMyObjectGIT( cookie ); if( !pMyObjectGIT ) { //error handling, no object in git for given cookie }CComPtr<IImportantObject> pMyObject; if( !SUCCEEDED( pMyObjectGIT.CopyTo( &pMyObject ) ) ) { //error handling } /** * Now work with pMyObject */ pMyObjectGIT.Detach(); Sehr wichtig ist es, ein Detach auf ein GIT Pointer zu tätigen, ansonsten wird das Objekt aus der GIT entfernt. Dies geschieht automatisch im Destruktors des CComGITPtr. Das eigentliche entfernen aus der GIT geschieht im Helper Thread und nirgens sonst. Weiterführende Links: |