현재 프로젝트에서 COM을 배워야합니다. 나는 멍청하고 COM의 좋은 출발점을 찾을 수 없었습니다. MSDN과 인터넷 검색을 살펴 보았습니다. codeproject.com에서 흥미로운 기사를 찾았지만 만족스럽지 않습니다. 왜 COM을 사용합니까? 왜 존재합니까? 어떤 장소에 존재합니까? ..... 등등 .. 그럼,이 질문들에 대한 답을 어디서 찾을 수 있는지 말씀해 주시겠습니까?
현재 프로젝트에서 COM을 배워야합니다. 나는 멍청하고 COM의 좋은 출발점을 찾을 수 없었습니다. MSDN과 인터넷 검색을 살펴 보았습니다. codeproject.com에서 흥미로운 기사를 찾았지만 만족스럽지 않습니다. 왜 COM을 사용합니까? 왜 존재합니까? 어떤 장소에 존재합니까? ..... 등등 .. 그럼,이 질문들에 대한 답을 어디서 찾을 수 있는지 말씀해 주시겠습니까?
답변:
IUnknown을 배우는 것이 첫 번째 단계입니다.
초보자 연구에 적합한 COM 인터페이스는 IStream 인터페이스입니다. 많은 종류의 데이터 저장 방법을 사용하여 IStream 인터페이스를 구현하여 COM을 실습 할 수 있습니다.
2012/09/28 추가 :
COM 메커니즘이 개발 된 후 Microsoft 직원들은 이러한 메커니즘이 정통 OOP가 아닌 비정상적인 프로그래밍 트릭을 열 수 있음을 발견했습니다. 최하위 수준 IUnknown.QueryInterface
은 단지 방법 일뿐입니다. 그것은 무엇이든 할 수 있습니다. 이러한 트릭은 COM이 학습자를 위협하게 만듭니다. OOP에서 빌릴 수있는 기본 추론을 무효화 할 수 있기 때문입니다.
MSDN의 Microsoft 설명서는 이러한 비정상적인 트릭으로 인해 코드가 손상되는 방법을 설명하는 "COM is not ..."또는 "Most no assume"라고 말하는 데 많은 시간을 소비합니다.
COM 디자이너는 Liskov 대체 원칙 ( SOLID 의 "L" )을 사용하여 여러 인터페이스와 트릭을 사용하여 기본 OOP 추론 또는 프로그램 작업이 무효화되지 않도록합니다.
프로젝트에서 이러한 트릭을 사용하지 않으면 OOP 관점에서 COM을 보는 것이 좋습니다. 프로젝트에서 이러한 트릭을 사용하는 경우 COM을 자체 수정 코드로 간주해야합니다.
(Joke : L과 많은 시간을 보내야했기 때문에 일반적으로 다른 네 가지 원칙을 무시했습니다.)
COM의 주된 이유는 다른 메모리 공간에있을 수있는 응용 프로그램과 다른 응용 프로그램 및 dll 사이 및 다른 내부 개체 표현이있을 수있는 개체 사이에 개체 지향 통신 인터페이스를 제공하는 것입니다.
COM을 배울 때 기억해야 할 것은 C ++가 왕이었고 C를 사용하는 dll이라고 불리는 응용 프로그램이었습니다. 일반적인 ABI가 없었으며 (@rwong이 말한 것처럼) COM은 Microsoft 솔루션이었습니다.
COM을 사용하는 것이 조금 더 쉬운 Visual Studio 용 ATL (Active Template Library)을 살펴 보는 것이 좋습니다.
내가 하루에 다시 찾은 두 권의 책
http://www.amazon.com/Essential-COM-Don-Box/dp/0201634465/ref=sr_1_1?ie=UTF8&qid=1304946825&sr=8-1
http://www.amazon.com/Understanding-ActiveX-OLE-Developers-Technology/dp/1572312165/ref=pd_sim_b_4
hth
원래 DCOM 학습 (DCOM은 COM의 확장 일뿐 아니라이 책은 대부분 COM에 관한 책) 에서 COM에 대해 배웠습니다 . 10 년이 넘었고 사용하면 저렴해야합니다 (COM은 여전히 interop에 사용되지만 Microsoft 세계에서도 COM이 뜨겁지 않기 때문에).
COM이 존재하는 주된 이유는 구성 요소 기반 개발을 용이하게하기위한 것입니다. 이는 기본적으로 코드를 컴파일 할 때 라이브러리를 연결하는 대신 인터페이스 (외부 구성 요소와 통신하는 방법에 대한 설명)를 참조하고 일부 구현을 사용함을 의미합니다. 배포 할 때 Microsoft 자체 기술의 대부분을 기반으로합니다.
이 시스템은 모든 것이 관리되기 전에 냉각 된 일부 기능 (예 : 참조 계수 및 자체 설명 (IDispatch를 통한))을 지원합니다.
COM은 다른 소프트웨어 조각들이 서로 통신 할 수 있도록 90 년대에 만들어진 표준입니다. 가장 중요한 것은 하나의 소프트웨어가 객체를 만들거나 바인딩 한 다음 해당 인터페이스를 호출 할 수있는 이진 표준입니다. 이를 통해 ASP 페이지 (COM Objects)에서 호출 할 수있는 C ++로 DLL을 만들거나 VB 대화 상자 (ActiveX 컨트롤) 또는 Excel 워크 시트에 넣을 수있는 Delphi에서 컨트롤을 만들 수 있습니다. Word에 그림을 붙여 넣으면 COM도 사용되며 별도의 응용 프로그램이 단어에 포함됩니다. 덜 인기있는 원격 개체를 호출하는 DCOM은 일반적으로이 작업을 수행하는 간단한 방법이 있습니다.
따라서 Com / ActiveX / DCOM은 VB, VBA, C ++ / ATL, Delphi에서 10 년 전에 매우 인기가있었습니다. Dotnet은 훨씬 간단하지만 C #은 COM 및 VB 등의 대부분 사용을 대체했습니다.
여전히 닷넷 응용 프로그램이나 Java 또는 C ++에서 호출하려는 COM 인터페이스가 많이 있습니다. (넌 말 안해)
COM 인터페이스를 호출해야하는 경우 VB가 가장 간단한 방법입니다. Dotnet 4.0에서 C #은 동적 키워드를 가지고있어 IDispatch 인터페이스를 훨씬 쉽게 호출 할 수 있습니다.
많은 세부 사항을 알고 싶다면 실제로 C ++ 및 ATL을 사용해야합니다. CoCreateInstance와 같은 C API를 호출하십시오. 오래된 기술로 사용할 수 있지만 많이 사용하지 않는 경우 위의 권장 사항을 따르십시오.
어떤 모니터링 소프트웨어를보고 있는지 잘 모르겠지만 dotnet의 System.Management 클래스를 통해 사용할 수 있습니다.
다음은 유용한 COM 개요입니다.
첫 번째 비디오는 다른 언어로 작성되고 (언어 독립적) 다른 기계 (프로세스) (위치 독립적 / 투명)에있는 코드를 재사용하기 위해 이진 구성 요소를 만드는 일반적인 아이디어에 대해 설명합니다. 이 기술은 일부 소프트웨어 회사에서 소프트웨어를 구매하여 자체 소프트웨어에 내장하거나 시스템에 코드를 처음부터 작성하는 대신 다른 소프트웨어 (회사)와 통합하는 데 사용됩니다.
이 기술에는 세 가지 버전 (구현)이 있습니다.
C ++ 개발자를위한 OLE / COM / DCOM / ActiveX (ATL은 프로그래머의 작업을보다 쉽게 만들어줍니다)
Java 개발자를위한 JavaBeans / RMI / EJB
CORBA / IIOP
소프트웨어를 Java로 작성하고 패키지에 이미 존재하지만 C ++로 작성되었으며 다른 시스템에있는 기능을 추가하려고 할 때 유용한 기술로 생각하십시오. 로컬 머신. "new"를 어떻게 호출합니까? 어떻게 객체를 만들고 메소드를 호출합니까?
COM 코딩을하는 사람들이 본 다음 책들은 책꽂이에 있습니다.
COM 및 ATL 3.0 개발자 워크샵
내부 Com
필수 COM