2009-10-29 3 views
11

저는 COM을 처음 접했고 그것이 무엇인지 또는 그것이 존재하는 이유를 알지 못합니다.구성 요소 개체 모델 (COM)이란 무엇입니까? 언어와 관련이 있습니까?

OOP와 같은 프로그래밍 방법입니까? 프로그래밍 언어가이를 지원해야합니까? 나는 그것에 대해 내 교수에게 물었다

(특별한 키워드 또는 무언가), 그는 말했다 :

COM은 OOP를 할 수있는 바이너리 안정적인 방법입니다. 바이너리 레이아웃 (뭔가 .. ..)을 알아야합니다.

나는 그것이 무엇을 의미하는지 알지 못합니다. 어떤 사람들은 코드 재사용에 사용된다고 말합니다. OOP는 이미 그 일을 훌륭하게 해냈습니다. 그렇다면이 COM은 왜 처음부터 진화 했습니까?

C++ 및 COM에는 무엇이 있습니까? COM을 볼 때마다 항상 추상 C++ 예제로 설명됩니다. C++ 용입니까?

COM의 필요성을 이해할 수 있도록 사례 또는 사례를 보여줄 수 있습니까? 이것을 배우기위한 요구 사항은 무엇입니까? 그래서 내 구성 요소를 작성할 수 있습니까?

+0

"내 구성 요소를 작성하는 데 필요한 내용은 무엇입니까?" 주요 고려 사항 : 이러한 구성 요소에 COM을 사용해야합니까? 요즘 COM은 기본적으로 유산입니다. Windows Explorer와 같이 이미 COM 기반 환경에 필요하지만 대부분의 경우 DCOM을 메시징 (예 : WCF)으로 대체하여 .NET을 사용할 가능성이 더 큽니다. COM을 필요로하는 특정 유스 케이스가 아니라면 (또는 단지 컴포넌트 아키텍처에 관심이 많다), 지금 당장 배워야 할 훌륭한 기술이 아닐 것입니다. – itowlson

+2

COM 개체의 메모리 내 레이아웃이 너무 많은 C++ 예제를 보는 이유는 가상 함수가있는 C++ 클래스와 완전히 동일하다고 생각합니다. 사소한 차이점이 있을지 모르지만 C++은 대부분의 경우 COM 개체를 직접 사용할 수 있습니다. – rmeador

답변

7

핵심은 특정 언어와 독립적 인 데이터 전달 계약을 제공하는 방법입니다.

    : COM을 지원하는 많은 언어가 있기 때문에 그것은,라도 유용 언어에 의존하지 실제로

    는 다른 몇 가지 예에 유용합니다 (C++, C, .NET 및 Java 구현이있다)

  1. 다른 언어 간의 통신 : COM은 언어와 독립적이므로 COM을 사용하여 다른 언어로 된 구성 요소간에 데이터를 전달할 수 있습니다. 예를 들어 COM을 사용하여 C++, Java 및 .NET 코드 사이에서 대화 할 수 있습니다.
  2. 스레딩 의미 : COM을 사용하면 특정 구성 요소에 대한 스레딩 의미를 정의하여 해당 구성 요소가 어디에 사용되는지에 관계없이 적절한 스레드 컨텍스트에서 만들어 지도록 할 수 있습니다.
  3. 일반 구성 요소입니다. 그래서,

    COM은 시스템의 다른 사용자 지정 라이브러리를 윈도우 API를 확장하고 게시하는 방법입니다 :

+0

>> "COM을 지원하는 언어가 많이 있습니다." 그래서 언어가이를 지원해야합니까? 언어처럼 OOP를 지원해야합니까? 그렇다면 왜 "객체 지향 언어와 같은 컴포넌트 지향 언어"에 대해 들어 본 적이 없습니까? – claws

+0

@claws, 실제로 특정 언어 지원없이 언어로 COM 레이어를 구현할 수 있습니다. COM serializer 및 메시지 전달자를 API로 쓰는 것이 본질적입니다. 필자는 자바의 구현 방식을 생각하지만, 그 문제를 다루는 데 오랜 시간이 걸렸습니다. – JaredPar

+4

COM에는 언어 지원이 절대적으로 필요하지 않습니다. 처음부터 COM 객체를 생성하고 사용할 수있었습니다. 언어 지원은 없었으며 단지 많은 매크로가있었습니다.COM의 원래 C++ 구현은 매크로 기반이었고 언어는 변경되지 않았습니다. 오늘날에도 COM의 핵심은 언어 변경보다는 매크로를 통해 구현되는 것으로 생각됩니다 (_com_ptr_t와 같은 도우미 유형이 있지만 이것은 핵심이 아닌 도우미입니다). – itowlson

3

는 잠시 생각 후, 난 당신이 될 생각을 파악하기 위해 넣어하는 가장 좋은 방법을 생각 애플리케이션을 다시 컴파일 할 필요없이 같은 방식으로 새로운 API를 찾아서 사용할 수 있습니다.

COM 개체는 입니다 (Windows 레지스트리에 몇 가지 후크를 추가하여)입니다. 이 작업이 완료되면 응용 프로그램은 런타임에 해당 예상 라이브러리가 있는지 쿼리하고 가용성에 따라 더 진행할 방법을 결정할 수 있습니다 (정적으로 링크 된 라이브러리를 찾을 수 없을 때 충돌하는 대신).

이 메커니즘은 언어와 관련이 없으므로 모든 언어로 작성된 응용 프로그램은 해당 인터페이스를 호출하고 해당 라이브러리를 호출 할 수 있어야합니다. 그러나 실제로 일부 언어는 일부 COM 유형을 지원하지 않기 때문에 제한된 COM 기능을 사용할 수 있습니다.

의견에 귀하의 질문에 대답 :

는 COM 아무것도 설치할 필요를 사용하지 않으려면.WinAPI 함수의 형태로 모든 것이 이미 있습니다. 응용 프로그램에서 간단하게 호출 할 수 있습니다. DllGetClassObject 및 CoGetClassObject는 COM 개체를 인스턴스화하는 데 사용됩니다. CoRegisterClassObject는 라이브러리에 포함 된 COM 개체를 시스템에 등록하는 데 사용됩니다.

COM 개체와의 일관된 생성 및 상호 작용을 가능하게하기 위해 클래스 개체에 대한 생성이 클래스 패밀리에 위임되었습니다. 이러한 개체는 일종의 도우미 개체입니다. CoGetClassObject를 호출하고 필요한 객체의 클래스 팩토리와 대화 할 수 있도록 요청합니다. 해당 클래스 라이브러리에 대한 인터페이스가 주어지면 필요한 객체를 인스턴스화하도록 요청합니다. 그런 다음 노출하는 인터페이스를 통해 객체를 조작 할 수 있습니다. Component Object Model

+0

나는 COM을 MS Windows 용이라고 본다. JavaBeans, CORBA는 다른 운영 체제의 COM에 대한 대안입니다. 권리? 다른 OS에서 COM 대체품을 사용하려면 소프트웨어를 설치해야합니까? MSWindows의 어떤 구성 요소가 이러한 구성 요소를 정확히 관리합니까? – claws

+0

COM은 실제로 크로스 플랫폼 환경에서 사용될 수 있습니다. 모든 클라이언트가 이해할 수있는 형식 일뿐입니다. 항상 그렇지는 않습니다. –

1

Component Object Model는 언어 독립적 인 바이너리 객체 인터페이스에 대한 마이크로 소프트에 의해 정의 된 표준, 즉,이 객체와 호출 방법을 주위에 전달하는 다른 OO 언어를 할 수 있습니다 :

은 위키 백과에이 간단한 개요에서보세요 그 (것)들에.

+1

언어는 OO 일 필요는 없습니다. C#과 같은 OO 이외의 언어를 사용하여 COM 구성 요소와 통신 할 수 있습니다. – JaredPar

5

COM은 Microsoft Office 응용 프로그램이 서로 통신 할 수있게 해주는 메커니즘으로 처음 만들어졌으며 두 번째 반복에서 이진 코드 구성 요소가 어떻게 구성되었는지에 대한 사양이되도록 수정 및 확장되었습니다. (COM 사양에 부합하는 바이너리 파일 (컴파일 된 .dll 또는 .exe)이있는 한) 서로 통신하고 데이터를 공유 할 수 있습니다.

이 목적은 코드 구성 요소가 여러 클라이언트 코드 구성 요소에 의해 재사용 될 수 있다는 것을 의미하며 원래 코드 구성 요소는 아무 것도 모르고 구성 요소가 원래 컴파일되었을 때 존재하지 않았 음을 의미합니다. . COM의 원래 설계자 중 한 명인이 말하자면, Don Box :

[...] 구성 규칙이 구성 요소 계약을 유형 정의로 표현한다는 것이 디자인 패러다임이었습니다. 이것은 COM이 대체 한 세계에서 한 걸음 더 나아갔습니다. 계약은 간단한 기능 진입 점으로 만 표현되었습니다.이 점에서 COM은 코드의 동적 로딩과 형식 시스템을 상당히 일관된 방식으로 결합 시켰기 때문에 큰 발전이었습니다 .