COM과 .NET

COM과 .NET (Windows)

Windows에서 서로 다른 애플리케이션과 컴포넌트를 연결해야 한다면, 이번 장이 바로 그 주제예요. COM(Component Object Model)은 DCE RPC(공개 표준) 위에 얹힌 객체 지향 계층(그리고 관련 서비스들)이며, 공통 호출 규약을 정의해서 어떤 언어로 작성된 코드든 다른 언어의 코드를 호출하고 함께 동작할 수 있게 해 줘요(그 언어들이 COM을 인식하기만 하면요). 게다가 코드가 반드시 같은 실행 파일 안에 있을 필요도 없어요. DLL에서 불러오거나, 같은 머신에서 실행 중인 다른 프로세스에서 찾거나, DCOM(분산 COM)을 쓰면 원격 머신의 다른 프로세스에서 찾을 수도 있어요 — 여러분의 코드가 컴포넌트가 어디 있는지 몰라도 되죠.

출처: COM and .Net (Windows)

본문

COM에는 OLE Automation이라는 하위 집합이 있어요. 이는 COM 객체에 대한 느슨한 바인딩(loose binding)을 허용하는 COM 인터페이스들의 모음으로, 객체가 어떻게 동작하는지에 대한 컴파일 타임 지식 없이도 런타임에 객체를 인트로스펙션하고 호출할 수 있게 해 줘요. PHP COM 확장은 이 OLE Automation 인터페이스를 이용해서 스크립트에서 호환 가능한 객체를 생성하고 호출할 수 있게 해요. 엄밀히 말하면 모든 COM 객체가 OLE 호환은 아니므로, 이 확장은 사실 "PHP용 OLE Automation 확장"이라고 불러야 맞아요.

그렇다면 왜 COM을 써야 할까요? COM은 Windows 플랫폼에서 애플리케이션과 컴포넌트를 서로 이어 붙이는 주요 방법 중 하나예요. COM을 사용하면 Microsoft Word를 실행해서 문서 템플릿을 채우고 결과를 Word 문서로 저장해 웹사이트 방문자에게 보낼 수도 있고, 네트워크 관리 작업이나 IIS 설정에 COM을 쓸 수도 있어요. 이건 가장 흔한 용례일 뿐이고, COM으로 훨씬 더 많은 걸 할 수 있어요.

또한 Microsoft가 제공하는 COM 인터오퍼러빌리티(interoperability) 계층을 통해 .NET 어셈블리의 인스턴스화와 생성도 지원해요.

주요 클래스

  • com — COM 객체를 나타내는 클래스. com::__construct로 생성해요.
  • dotnet — .NET 객체를 나타내는 클래스. dotnet::__construct로 생성해요.
  • variant — variant 값을 나타내는 클래스. variant::__construct로 생성해요.
  • COMPersistHelper — COM 객체의 영속화(persistence)를 돕는 클래스. 파일/스트림으로 저장하고 불러오는 메서드들(GetCurFileName, LoadFromFile, SaveToFile 등)을 제공해요.
  • com_exception — COM 관련 예외 클래스예요.
  • com_safearray_proxy — COM safearray를 다루는 프록시 클래스예요.

주요 함수

  • com_create_guid — 전역 고유 식별자(GUID)를 생성해요
  • com_event_sink — COM 객체의 이벤트를 PHP 객체에 연결해요
  • com_get_active_object — 이미 실행 중인 COM 객체의 핸들을 반환해요
  • com_load_typelib — 타입라이브러리(Typelib)를 불러와요
  • com_message_pump — timeoutms 밀리초 동안 대기하면서 COM 메시지를 처리해요
  • com_print_typeinfo — 디스패처블 인터페이스에 대한 PHP 클래스 정의를 출력해요

또한 variant 값에 대한 다양한 연산 함수가 준비되어 있어요. variant_add(덧셈), variant_and(비트 AND), variant_cat(문자열 결합), variant_cmp(비교), variant_div(나눗셈), variant_mul(곱셈), variant_mod(나머지), variant_pow(거듭제곱), variant_round(반올림), variant_cast/variant_set_type(타입 변환) 등의 함수로 variant 값을 계산하고 변환할 수 있어요.

더 알아보기

설치 요구 사항, 런타임 설정, 오류 처리 방식과 예제들은 Installing/Configuring, Errors and error handling, Examples 문서를 확인해 보세요. 배열형 COM 프로퍼티를 다루는 방법은 Each For Arrays 문서에서 다뤄요.