COM 개체는 COM 사양을 사용하는 재사용 가능한 소프트웨어 구성 요소인 "구성 요소 개체 모델 개체"를 의미합니다. COM 사양을 사용하면 COM 개체가 제대로 작동하고 응용 프로그램에 쉽게 통합될 수 있습니다. COM 개체는 일반적으로 일반 DLL과 같은 DLL(동적 링크 라이브러리)을 사용하여 구현되며, COM 개체는 사용자 응용 프로그램이 지원되는 작업을 완료하기 위해 호출할 수 있는 일부 메서드를 노출합니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.
COM 개체란 무엇입니까?
COM(구성 요소 개체 모델) 개체는 COM 사양을 사용하는 재사용 가능한 소프트웨어 구성 요소입니다. COM 사양을 사용하면 COM 개체가 제대로 작동하고 응용 프로그램에 쉽게 통합될 수 있습니다. 실제로 COM은 기본적으로 응용 프로그램에 대해 많은 작업을 수행할 수 있는 블랙 박스와 동일합니다.
COM 개체는 일반적으로 동적 링크 라이브러리(DLL)를 사용하여 구현됩니다. 일반 DLL과 마찬가지로 COM 개체는 애플리케이션이 지원되는 작업을 완료하기 위해 호출할 수 있는 메서드를 노출합니다. 응용 프로그램과 COM 개체 간의 상호 작용은 응용 프로그램과 C++ 개체 간의 상호 작용과 다소 유사하지만 둘 사이에는 몇 가지 중요한 차이점이 있습니다.
COM 개체는 정확한 캡슐화를 구현합니다. 단순히 객체를 생성하고 해당 객체의 공용 메서드를 임의로 호출할 수는 없습니다. COM 개체의 공용 메서드는 하나 이상의 인터페이스 그룹에 배치됩니다. 메서드를 사용하려면 COM 개체를 생성하고 COM 개체에서 COM 개체에 대한 적절한 인터페이스를 얻어야 합니다. 예: IDirect3DCubeTexture8 인터페이스에는 큐브 프레임 리소스를 처리할 수 있는 메서드가 포함되어 있습니다. 이 인터페이스에 속하지 않는 메소드에는 액세스할 수 없습니다.
COM 개체 생성은 C++ 개체 생성과 다릅니다. COM 개체를 만드는 방법에는 여러 가지가 있지만 모두 COM 관련 기술을 포함합니다. Microsoft의 DirectX API(응용 프로그래밍 인터페이스)에는 대부분의 DirectX 개체를 생성하기 위한 다양한 도우미 기능과 메서드가 포함되어 있습니다.
COM 개체의 수명을 제어하려면 COM_특정 기술을 사용해야 합니다.
COM 개체는 명시적으로 로드할 필요가 없습니다. COM 개체는 DLL에 포함되어 있습니다. 그러나 이 COM 개체를 사용하는 경우 DLL을 명시적으로 로드하거나 정적 라이브러리를 명시적으로 로드할 필요가 없습니다. 각 COM 개체에는 개체를 만드는 데 사용되는 고유한 등록 ID가 있습니다. COM은 자동으로 올바른 DLL을 로드합니다.
COM은 바이너리 사양입니다. COM 개체는 다양한 언어로 작성하고 액세스할 수 있습니다. COM 개체 소스 코드에 대해 아무것도 알 필요가 없습니다. 예: Microsoft Visual Bisice 애플리케이션은 매일 COM 개체를 사용하여 C++로 작성됩니다.
Objects and Interfaces
개체와 인터페이스의 차이점을 이해하는 것이 중요합니다. 경우에 따라 개체 이름이 기본 인터페이스 이름으로 참조되는 경우도 있습니다. 그러나 엄밀히 말하면 이 두 조건은 서로 바꿔 쓸 수 없습니다.
▲COM 개체는 원하는 수의 인터페이스를 노출할 수 있습니다. 예를 들어 모든 COM 개체는 IUnknown 인터페이스를 노출해야 하며 일반적으로 최소한 하나 이상의 추가 인터페이스를 노출합니다. 이러한 특수 메서드를 사용하려면 COM 개체를 만들어야 할 뿐만 아니라 올바른 인터페이스 포인터도 가져와야 합니다.
▲많은 객체가 동일한 인터페이스를 노출할 수 있습니다. 인터페이스는 지정된 작업을 수행하는 메서드 집합입니다. 인터페이스의 정의는 메소드의 구문과 해당 기능을 지정합니다. 특수 작업을 지원하는 모든 COM 개체는 적절한 인터페이스를 노출합니다. 일부 인터페이스는 고도로 전문화되어 단일 개체에 의해서만 노출됩니다. 대부분의 경우에는 여러 개체에 의해 노출됩니다. 매우 특별한 경우는 IUnknown 인터페이스가 모든 COM 개체에 의해 노출되어야 한다는 것입니다.
참고: 개체가 인터페이스를 노출하는 경우 인터페이스에서 지원되는 모든 메서드를 정의해야 합니다. 즉, 호출할 수 있는 모든 메서드는 해당 메서드가 존재하는지 확인해야 합니다. 그러나 메서드 구현의 세부 사항은 개체마다 변경될 수 있습니다. 예를 들어, 서로 다른 개체는 서로 다른 알고리즘을 사용하여 최종 결과를 얻을 수 있습니다. 때로는 객체가 이전 인터페이스를 노출하고 메소드의 하위 집합만 지원해야 하는 경우도 있습니다. 나머지 메서드를 성공적으로 호출할 수는 있지만 E_NOTIMPL을 반환합니다.
COM 표준에서는 인터페이스가 출시되면 해당 정의를 변경할 수 없도록 요구합니다. 이 기존 인터페이스에는 새 메소드를 추가할 수 없습니다. 새 인터페이스를 다시 생성해야 합니다. 일반적인 방법은 새 메서드를 추가하기 전에 차세대 인터페이스에 이전 인터페이스의 모든 메서드를 포함하는 것입니다.
인터페이스가 여러 세대를 갖는 것은 매우 일반적입니다. 종종 그 내용은 동일하지만 세부 사항은 다릅니다. 일반적으로 개체는 각 세대의 인터페이스를 노출할 수 있습니다. 이렇게 하면 이전 프로그램이 개체의 이전 인터페이스를 계속 사용할 수 있고 새 프로그램이 새 인터페이스의 기능을 활용할 수 있습니다. 일반적으로 인터페이스 패밀리는 동일한 이름을 가지며 그 뒤에 세대를 나타내는 정수가 옵니다. 예를 들어 원래 인터페이스의 이름이 IMyInterface인 경우 다음 두 세대의 인터페이스 이름은 IMyInterface2 및 IMyInterface3으로 지정됩니다. 정수는 일반적으로 directx의 버전 번호를 사용합니다.
GUIDS
GUIDS(Globally Unique Identifier)는 COM 프로그램 모델의 핵심 부분입니다. 가장 기본적인 원칙에서 GUID는 128비트 구조입니다. 그러나 GUID는 두 GUID가 동일하지 않도록 보장하는 방식으로 생성됩니다. COM은 두 가지 주요 목적으로 GUID를 광범위하게 사용합니다.
1. 특정 COM 개체를 고유하게 식별합니다.
2. 특정 COM 인터페이스를 고유하게 표시합니다.
반환 값(HRESULT)
모든 COM 메서드는 HRESULT라는 32비트 값을 반환합니다. 대부분의 메서드에서 HRESULT는 실제로 두 가지 정보를 포함하는 구조입니다.
1. 이 방법의 성공 여부.
2. 메서드에서 지원하는 작업에 대한 자세한 정보를 출력합니다.
일부 메서드에서 반환된 HRESULT 값은 Winerror.h에 정의되어 있습니다. 메서드에서 반환된 HRESULT 값은 일부 사용자별 정보일 수도 있습니다. 이러한 값은 일반적으로 메서드의 참조 페이지에서 확인됩니다.
COM 개체에 대한 메서드 호출이 호출의 성공 또는 실패를 나타내는 다양한 코드를 반환할 수 있다는 사실은 반환 값을 테스트할 때 매우 주의해야 함을 의미합니다. 예를 들어, 메서드 호출의 반환 값이
S_OK이면 메서드 호출이 성공했음을 나타냅니다. 반환 값이 S_FAIL이면 호출이 실패했음을 나타내는 다른 코드도 반환될 수 있습니다. 통화의 성공 또는 실패. 다음 코드 조각은 코드에 대해 이러한 간단한 테스트를 수행하는 것이 안전하지 않음을 보여줍니다. 코드의 hr 값은 메소드 호출의 반환 값입니다.
if( hr == E_FAIL ) { //Handle the failure } else { //Handle the success }
이 코드가 E_FAIL만 반환하는 경우 이 코드 조각은 제대로 작동할 수 있습니다. 그러나 이는 그렇지 않습니다. 이 메서드 호출은 E_NOTIMPL, E_INVALIDARG와 같은 다른 값을 반환할 수도 있습니다. 코드가 이러한 값을 반환하면 이 코드 세그먼트는 해당 값을 처리하지 않으며 기본적으로 프로그램이 실행 중임을 나타냅니다. 정상적으로 작동하지만 실제 프로그램은 잘못된 것이 아닙니다.
메서드 호출에 대한 더 자세한 정보를 알고 싶다면 관련 반환 값을 각각 테스트해야 합니다. 그러나 메서드 호출이 성공했는지 여부만 알고 싶을 수도 있습니다. 메서드 호출이 성공했는지 테스트하는 좋은 방법은 메서드의 반환 값을 winerror.h 파일에 정의된 다음 두 매크로에 전달하는 것입니다.
1. SUCCEEDED 매크로는 호출이 성공했음을 나타내기 위해 TRUE를 반환하고, 호출이 실패했음을 나타내기 위해 FALSE를 반환합니다.
2. FAILED 매크로는 TRUE를 반환하여 호출이 실패했음을 나타내고, FALSE를 반환하여 호출이 성공했음을 나타냅니다.
FAILED 매크로를 사용하여 이전 코드 조각을 수정할 수 있습니다.
if( FAILED(hr) ) { //Handle the failure. } else { //Handle the success. }
위의 코드 조각은 E_NOTIMPL 및 E_INVALIDARG 오류를 처리합니다.
대부분의 메서드의 반환 값 HRESULT가 구조체 값이지만 반환 값 HRESULT가 단순한 정수 값인 메서드도 몇 가지 있습니다. 이는 정수 값을 반환하는 메서드가 항상 성공적으로 호출될 수 있음을 의미합니다. 이 유형의 반환 값을 SUCCESS 매크로에 전달하면 매크로는 항상 TRUE를 반환합니다. 일반적인 예는 IUnkoown::Release 메서드입니다. 이 메소드의 기능은 객체의 사용 횟수를 해제(감소)하고 객체의 현재 사용 횟수를 반환하는 것입니다. 사용 횟수는 객체의 수명을 식별하는 데 사용됩니다.
포인터 주소
COM 메서드에 대한 참조 페이지를 본 적이 있다면 다음과 같은 상황에 직면했을 수 있습니다.
HRESULT CreateDevice( . . . IDirect3DDevice8 **ppReturnedDeviceInterface )
일반적으로 모든 C 또는 C++ 개발자는 포인터에 익숙한 사람들에게 일반적으로 COM을 사용합니다. 추가적인 간접 표준을 사용합니다. 표준은 두 개의 별표(**) 뒤에 유형 사양과 일반적인 "pp" 접두사가 붙은 변수 이름입니다. 이전 예에서 ppReturnedDeviceInterface 매개변수는 IDirect3DDevice8 인터페이스에 대한 포인터의 주소입니다.
C++와 달리 COM 개체의 메서드에 직접 액세스할 수 없으며 대신 메서드를 노출하는 인터페이스에 대한 포인터를 얻어야 합니다. 객체 인터페이스의 메서드를 호출하는 구문은 포인터를 사용하여 C++ 메서드를 호출하는 구문과 동일합니다. 예를 들어 IMyTnterface::DoSomething 메서드를 호출하려면 다음 구문만 사용하면 됩니다.
IMyInterfance *pMyTface; . . . pMyIface->DoSomething(...) ;
COM 개체 인터페이스에 대한 포인터의 경우 인터페이스에 대한 포인터를 직접 만들 수 없습니다. 이 포인터를 얻으려면 하나 이상의 다른 메서드를 호출해야 합니다. 예를 들어 앞에서 언급한 CreateDevice 메서드입니다.
이 메서드를 통해 인터페이스 포인터를 얻으려면 요청한 인터페이스를 가리키는 변수를 선언해야 합니다. 이 변수의 주소를 CreateDevice 메서드에 전달합니다. 즉, 변수의 주소를 이 메서드에 전달해야 합니다. 이 메서드가 반환되면 이 변수는 요청한 인터페이스를 가리키며 이 포인터를 통해 이 인터페이스의 메서드에 액세스할 수 있습니다.
더 많은 프로그래밍 관련 지식을 보려면 프로그래밍 비디오를 방문하세요! !
위 내용은 자바스크립트의 COM 객체란 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!