2016-10-06 2 views
0

Sur mon ordinateur, plusieurs programmes exécutant l'accès à l'interface iTunesApp fournie par l'objet COM sont en cours d'exécution. Après quelques tests, j'ai découvert que certaines interactions (en particulier l'écoute d'événements) ne sont possibles que dans l'instance "originale" de l'objet. Cela signifie que si iTunes est déjà en cours d'exécution et que je lance iTunesApp app = new iTunesApp(), je crée une instance iTunesApp qui peut accéder à la bibliothèque et lire/mettre en pause, etc., mais qui n'est pas appelée lorsque des événements tels que app.OnPlayerPlayEvent sont déclenchés. Si je veux écouter des événements, je dois exécuter iTunesApp app = new iTunesApp() avec iTunes pas encore en cours d'exécution.Convertir un objet COM iTunes en un tableau d'octets/Utiliser l'objet iTunesApp sur plusieurs processus

Donc, ma solution à cela était que j'ai juste un programme exécuté au démarrage, démarrer iTunes et partager l'objet iTunesApp avec un autre programme qui en a besoin. Malheureusement, la classe n'est pas sérialisable, donc je ne peux pas la convertir facilement en un tableau byte [].

Ma question serait: Y at-il une possibilité de convertir l'objet en un tableau d'octets et le partager via MemoryMappedFile, Socket ou similaire? J'ai essayé BinaryFormatter.Serialize() ainsi que le paquet ProtoBuf, mais ni travaillé. Ou existe-t-il une méthode ou quelque chose qui me permet d'obtenir l'objet iTunesApp à partir d'une instance en cours d'exécution d'iTunes?

+0

Google pour GetRunningObjectTable() et des exemples. Je ne sais pas si iTunes crée une entrée dans le ROT, mais il vaut la peine de regarder la ROT pour voir si c'est le cas. –

Répondre

0

COM dispose d'une méthode standard de marshaling d'objets. Appelez CoMarshalInterface pour marshal l'objet dans un flux (pour la déclaration C#, voir CoMarshalInterface on pinvoke.net). Vous pouvez ensuite lire les octets qui ont été écrits dans l'IStream, donner ces octets à n'importe quel processus, unmarshal en utilisant CoUnmarshalInterface. Assurez-vous d'utiliser les bons indicateurs pour votre cas d'utilisation.