2011-10-10 3 views
3

J'ai une application GUI C++ Builder multi-thread, qui communique avec une application tierce via COM.Comment accéder aux objets COM de différents modèles d'appartements?

J'ai besoin d'appeler des méthodes de l'objet COM à partir de plusieurs threads, et je protège l'accès avec un mutex. Apparemment, le thread graphique principal doit utiliser le modèle STA, mais mes threads de travail doivent utiliser MTA. L'objet COM est construit dans un thread MTA.

Tout fonctionne correctement sauf accéder à l'objet COM à partir du thread graphique, en raison de la discordance MTA/STA. J'ai lu un peu au sujet de marshalling, mais n'ai pas essayé de l'implémenter, parce que les exemples que j'ai vus semblent exiger la sémantique différente d'accès selon le modèle actuel d'appartement, et je voudrais vraiment avoir le code que (à partir du POV d'un programmeur) ne se soucie pas du modèle d'appartement actuel.

Donc, existe-t-il un moyen idiomatique d'écrire du code COM qui fonctionne sur le 'même' objet, mais peut être appelé à partir des threads STA et MTA?

+2

Marshaling le pointeur d'interface est * nécessaire *, vous ne pouvez pas l'ignorer. IGlobalInterfaceTable le rend facile. –

+0

@Hans, oui, mais si je l'ai bien, certains threads ont besoin du pointeur marshalled, d'autres ont besoin de l'unmarshalled? Je suis à la recherche d'un moyen d'unifier cela ou de changer dynamiquement quel pointeur d'interface en fonction du modèle d'appartement thread en cours ...? – Roddy

+6

Eh bien, toujours marshal le pointeur. Vous obtenez juste l'original si aucune transition d'appartement n'est requise. –

Répondre

1

Placez l'interface de l'objet COM dans le Global Interface Table et laissez le GIT gérer le regroupement pour vous. Lorsqu'un thread demande l'interface COM, le GIT vérifie l'appartement appelant et fournit un pointeur direct ou un proxy approprié en conséquence. Votre code ne connaîtra pas la différence (ou le soin), utilisez simplement l'interface retournée normalement si nécessaire.

Ceci est documenté sur MSDN:

Accessing Interfaces Across Apartments

Questions connexes