2016-10-06 11 views
0

내 컴퓨터에서 COM 개체에서 제공하는 iTunesApp 인터페이스에 액세스해야하는 여러 프로그램이 실행 중입니다. 일부 테스트 후에 특정 상호 작용 (특히 이벤트 수신)이 객체의 "원래"인스턴스에서만 가능하다는 것을 발견했습니다. 즉, iTunes가 이미 실행 중이고 iTunesApp app = new iTunesApp()을 실행하면 라이브러리 및 재생/일시 정지 등에 액세스 할 수있는 iTunesApp 인스턴스를 만들지 만 app.OnPlayerPlayEvent과 같은 이벤트가 발생하면 호출되지 않습니다. 이벤트 듣기를 원한다면 iTunes가 이미 실행 중이 아닌 iTunesApp app = new iTunesApp()을 실행해야합니다.iTunes COM 개체를 바이트 배열로 변환/여러 프로세스에서 iTunesApp 개체 사용

그래서 내 솔루션은 부팅 할 때 프로그램을 실행하고 iTunes를 시작하고 iTunesApp 개체를 필요로하는 다른 프로그램과 공유한다는 것입니다. 불행히도, 클래스는 serializeable이 아니므로 byte [] 배열로 쉽게 변환 할 수 없습니다.

제 질문은 : 객체를 바이트 배열로 변환하고 MemoryMappedFile, Socket 또는 유사 항목을 통해 공유 할 수 있습니까? BinaryFormatter.Serialize()ProtoBuf 패키지를 시도했지만 어느 것도 작동하지 않았습니다. 아니면 실행중인 iTunes 인스턴스에서 iTunesApp 개체를 가져올 수있는 방법이나 방법이 있습니까?

+0

Google 용 GetRunningObjectTable() 및 예제. iTunes가 ROT에 항목을 생성하는지는 모르지만 ROT가 있는지 확인하는 것이 좋습니다. –

답변

0

COM에는 개체를 마샬링하는 표준 방법이 있습니다. CoMarshalInterface을 호출하여 개체를 스트림으로 마샬링합니다 (C# 선언의 경우 CoMarshalInterface on pinvoke.net 참조). 그런 다음 IStream에 기록 된 바이트를 읽고 해당 바이트를 모든 프로세스에 전달하고 CoUnmarshalInterface을 사용하여 비 정렬화할 수 있습니다. 유스 케이스에 맞는 플래그를 사용해야합니다.