2015-01-19 5 views
1

COM 및 C++을 사용하여 Windows에서 프로세스 간 통신을 수행하는 옵션을 조사했습니다.COM을 사용하는 Windows에서 로컬 컴퓨터의 프로세스 간 통신

Windows 용 프로세스 간 통신 옵션 목록을 제공하는 this article on MSDN이 있으며 그 중 하나가 COM입니다.
하지만 불행히도 COM 옵션은 세부 정보없이 표시됩니다.

누군가가 Windows에서 프로세스 간 통신에 COM을 사용하는 방법에 대한 문서 또는 기타 리소스에 대한 지침이 있습니까?

원격 컴퓨터와 통신하는 데 관심이 없습니다 (예 : DCOM). 난 그냥 같은 로컬 컴퓨터에서 프로세스 간 통신에 관심이 있어요.

사용자 지정 통신 프로토콜을 구현하는 일부 사용자 지정 COM 인터페이스를 정의한 다음 동일한 로컬 컴퓨터에서 실행되는 서버 프로그램과 클라이언트 프로그램 (각 프로세스가 자체 프로세스에 있음)을 갖고 COM을 사용하여 둘 사이의 통신 (예 : 클라이언트가 서버에 요청을 보내고 서버가 COM 인터페이스를 사용하여 모든 응답을 반환 함).

예를 들어, 프로세스 간 통신을 구현하기 위해 미리 정의 된 COM 인터페이스가 있습니까? 그렇다면 무엇입니까?

이 주제에 대한 자습서 나 자세한 안내가 있으면 도움이됩니다.

+0

지원 프로세스 interop은 COM에서 고유 한 기능이므로 "특수"인터페이스가 필요하지 않습니다. 우리는 여기서 튜토리얼 링크를하지는 않지만 이미 알고 있습니다. –

+0

필자는 _in-proc_ COM DLL (예 : 셸 확장)에 대한 지식을 보유하고 있지만, out-of-proc COM 서버를 한 번도 사용해 본 적이 없으며 COM을 inteprocess 통신의 한 형태로 사용한 적이 없습니다[email protected] patthoyts의 대답은 적어도이 "_ Running Object Table"_ 요소를 언급하는 초기 지침입니다. COM은 거대하고 문서화 된 튜토리얼에 초점을 맞추는 것이 도움이됩니다. –

답변

3

양쪽에 대해 알고있는 COM 인터페이스가있는 경우 하나의 프로세스가이를 구현하는 일부 개체를 등록 할 수 있습니다. Running Object Table은 모니 커를 사용합니다. 그런 다음 다른 프로세스는 모니 커 식별자를 사용하여이 프로세스 간 테이블에서 개체를 검색하고 알려진 인터페이스를 쿼리합니다. 이제 클라이언트 프로세스는 다른 프로세스에 존재하는 것에 대한 참조를 가지며 호출은 COM에 의해 정렬됩니다.

특히 인터페이스가 올바르게 정렬되도록하는 데있어 많은 문제가 있습니다. 마샬링은 여러 프로세스를 사용하기 시작하거나 COM 인터페이스로 .Net을 사용하기 전까지는 종종 잘 테스트되지 않습니다. oleautomation 호환 유형을 사용하고 IDL의 인터페이스를 [oleautomation] 속성으로 표시하면 형식 라이브러리 마샬링이 제대로 작동하는지 확인하는 데 도움이 될뿐만 아니라 배열과 함께 사용되는 다른 속성에주의를 기울여야합니다. 우리는 몇 년 전에 IPropertyBag2 인터페이스에서 이것을 발견했습니다.

HRESULT Read(
      [in] ULONG cProperties, 
      [in] PROPBAG2 * pPropBag, 
      [in] IErrorLog * pErrLog, 
      [out] VARIANT * pvarValue, 
      [out] HRESULT * phrError 
     ); 

을 제공하고 어레이에서 하나 이상의 VARIANT 마샬하지 않습니다 비주얼 스튜디오 6 IDL 설명 ocidl.idl이 같다. 최신 버전은 다음과 같습니다 올바르게 cProperties 매개 변수에 의해 지정된 크기로 pvarValue 배열의 크기를 연관

HRESULT Read(
      [in] ULONG cProperties, 
      [in, size_is(cProperties)] PROPBAG2 * pPropBag, 
      [in, unique] IErrorLog * pErrLog, 
      [out, size_is(cProperties)] VARIANT * pvarValue, 
      [in, out, unique, size_is(cProperties)] HRESULT * phrError 
     ); 

합니다. 두 번째 정의가있는 typelibrary가 등록되었다고 가정하면이 인터페이스는 이제 제대로 정렬되어야합니다. 그러나 몇 년 전에 누락 된 매개 변수는 왜 몇 가지 뇌 세포가 지속성이 실패했는지를 알아 내려고했습니다.

+0

Running Object Table에 대한 이러한 포인터와 기타 일반 정보를 보내 주셔서 감사합니다. 잘못된 인터페이스 마샬링에 대해 조금 자세히 설명해 주시겠습니까? 내 말은 : 인터페이스 경계에서'std :: vector'와 같은 STL 클래스를 가질 수는 없겠지만, 마샬링 된 인터페이스에서 유형을 정수, 부울 및 COM 유형과 같은 "단순"유형으로 제한하면 안전할까요? 'BSTR'과 다른 인터페이스 포인터 (예.'IUnknown *')? –

+0

나는 과거의 마샬링 함정을 확장했다. – patthoyts

+0

추가 해주셔서 감사합니다. –