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?
Marshaling le pointeur d'interface est * nécessaire *, vous ne pouvez pas l'ignorer. IGlobalInterfaceTable le rend facile. –
@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
Eh bien, toujours marshal le pointeur. Vous obtenez juste l'original si aucune transition d'appartement n'est requise. –