Qt에서 ActiveX 컨트롤 및 COM 사용
QAxContainer 모듈은 ActiveQt 프레임워크의 일부입니다. 이 모듈은 ActiveX 컨트롤의 컨테이너 역할을 하는 ` QWidget `의 서브클래스인 ` QAxWidget`와, 비시각적 COM 객체에 쉽게 접근하는 데 사용할 수 있는 ` QObject `의 서브클래스인 ` QAxObject`를 구현하는 라이브러리를 제공합니다. QAxScript( QAxScriptManager ) 및 QAxScriptEngine 클래스를 통해 이러한 클래스로 임베드된 COM 개체에 대한 스크립팅이 가능하며, 일련의 도구를 사용하면 프로그래밍 방식으로 COM 개체에 쉽게 접근할 수 있습니다.
이 모듈은 다음 여섯 개의 클래스로 구성됩니다.
- QAxBase 는 COM 개체 또는 ActiveX 컨트롤을 초기화하고 액세스하기 위한 API를 제공하는 추상 클래스입니다.
- QAxObject 는 COM 개체를 래핑하는 QObject 를 제공합니다.
- QAxWidget 는 ActiveX 컨트롤을 래핑하는 QWidget 입니다.
- QAxScriptManager, QAxScript 및 QAxScriptEngine 는 Windows Script Host에 대한 인터페이스를 제공합니다.
표준 ActiveX 컨트롤을 사용하여 고수준 사용자 인터페이스 기능을 제공하는 몇 가지 예제 응용 프로그램이 제공됩니다.
라이브러리 사용
COM 개체와 ActiveX 컨트롤을 호스팅할 수 있는 Qt 애플리케이션을 빌드하려면, 애플리케이션의 ` QAxContainer ` 파일에 다음을 추가하여 애플리케이션이 ` ` 모듈에 대해 링크되도록 하십시오.
QT += axcontainer을 추가하여 애플리케이션을 .pro 모듈에 링크하십시오.
QAxContainer 애플리케이션 배포
QAxContainer 라이브러리는 정적이므로 이 모듈을 사용할 때 추가 파일을 재배포할 필요가 없습니다. 그러나 사용 중인 ActiveX 서버 바이너리가 대상 시스템에 설치되어 있지 않을 수 있으므로, 패키지와 함께 제공해야 하며 애플리케이션 설치 과정에서 이를 등록해야 합니다.
COM 객체 인스턴스화
COM 객체를 인스턴스화하려면 QAxBase::setControl() API를 사용하거나, 사용 중인 QAxBase 하위 클래스의 생성자에 객체 이름을 직접 전달하십시오.
컨트롤은 다양한 형식으로 지정할 수 있지만, 가장 빠르고 강력한 형식은 객체의 클래스 ID(CLSID)를 직접 사용하는 것입니다. 클래스 ID 앞에는 객체가 실행되어야 하는 원격 시스템에 대한 정보를 추가할 수 있으며, 라이선스가 적용된 컨트롤의 경우 라이선스 키를 포함할 수도 있습니다.
일반적인 오류 메시지
ActiveQt는 런타임 중에 오류 상황이 발생하면 디버그 출력에 오류 메시지를 출력합니다. 일반적으로 이러한 메시지를 확인하려면 디버거에서 프로그램을 실행해야 합니다(예: Visual Studio의 디버그 출력).
요청된 컨트롤을 인스턴스화할 수 없습니다
QAxBase::setControl()에서 요청된 컨트롤이 이 시스템에 설치되어 있지 않거나, 현재 사용자가 해당 컨트롤에 접근할 수 없습니다.
해당 컨트롤은 관리자 권한이나 라이선스 키가 필요할 수 있습니다. 컨트롤이 라이선스가 적용된 경우, 설명서에 명시된 대로 QAxBase::setControl에 라이선스 키를 전달하십시오.
Object API에 대한 액세스
ActiveQt는 COM 객체에 대한 Qt API를 제공하며, COM 데이터 유형을 Qt의 해당 유형으로 대체합니다.
COM 객체의 API를 호출하는 방법에는 네 가지가 있습니다:
- C++ 네임스페이스 생성
- 이름 기반 호출
- 스크립트 엔진을 통한 호출
- 네이티브 COM 인터페이스 사용
C++ 네임스페이스 생성
접근하려는 타입 라이브러리에 대한 C++ 네임스페이스를 생성하려면 dumpcpp 도구를 사용하십시오. 사용하려는 타입 라이브러리에서 이 도구를 수동으로 실행하거나, 애플리케이션의 ` .pro ` 파일에 있는 ` TYPELIBS ` 변수에 타입 라이브러리를 추가하여 빌드 시스템에 통합할 수 있습니다:
TYPELIBS = file.tlbdumpcpp가 타입 라이브러리의 모든 API를 노출하지 못할 수도 있다는 점에 유의하십시오.
생성된 헤더 파일을 코드에 포함시켜 생성된 C++ 클래스를 통해 객체 API에 액세스하십시오. 자세한 내용은 Qutlook 예제를 참조하십시오.
Call-by-Name
QAxBase::dynamicCall() 및 QAxBase::querySubObject()은 물론 QObject::setProperty() 및 QObject::property() API를 사용하여 COM 객체의 메서드와 속성을 이름으로 호출할 수 있습니다. dumpdoc 도구를 사용하여 임의의 COM 객체 및 그 하위 객체에 대한 Qt API 문서를 얻을 수 있습니다. 단, COM 객체의 모든 API를 사용할 수 있는 것은 아닐 수 있습니다.
스크립트 엔진을 통한 함수 호출
Qt 애플리케이션은 시스템에 설치된 모든 ActiveScript 엔진을 호스트할 수 있습니다. 그러면 스크립트 엔진은 COM 객체에 액세스하는 스크립트 코드를 실행할 수 있습니다.
스크립트 엔진을 인스턴스화하려면, QAxScriptManager::addObject()를 사용하여 스크립트에서 액세스하려는 COM 객체를 등록하고, QAxScriptManager::load()를 사용하여 스크립트 코드를 엔진에 로드하십시오. 그런 다음 QAxScriptManager::call() 또는 QAxScript::call()를 사용하여 스크립트 함수를 호출하십시오.
스크립팅을 통해 사용할 수 있는 COM 개체의 API는 사용된 스크립트 언어에 따라 다릅니다.
ActiveX 테스트 컨테이너 는 스크립트 파일 로딩을 시연합니다.
네이티브 COM 인터페이스를 사용하여 함수 호출
위의 방법으로는 액세스할 수 없는 COM 개체의 함수를 호출하려면 QAxBase::queryInterface()을 사용하여 COM 인터페이스를 직접 요청할 수 있습니다. 해당 인터페이스 클래스의 C++ 정의를 얻으려면 컨트롤과 함께 제공된 타입 라이브러리와 함께 #import 지시어를 사용하십시오. 자세한 내용은 컴파일러 설명서를 참조하십시오.
일반적인 오류 메시지
ActiveQt는 런타임 중에 오류 상황이 발생하면 디버그 출력에 오류 메시지를 표시합니다. 일반적으로 이러한 메시지를 확인하려면 디버거에서 프로그램을 실행해야 합니다(예: Visual Studio의 디버그 출력).
QAxBase::internalInvoke: 해당 메서드가 없습니다
QAxBase::dynamicCall() 호출이 실패했습니다. 함수 프로토타입이 객체의 API에 정의된 어떤 함수와도 일치하지 않았습니다.
IDispatch 멤버 호출 오류: 필수 매개변수가 누락되었습니다
QAxBase::dynamicCall() 호출에 실패했습니다. 함수 프로토타입은 올바르지만, 제공된 매개변수가 너무 적습니다.
IDispatch 멤버 호출 오류: 매개변수 n의 유형 불일치
QAxBase::dynamicCall() 호출에 실패했습니다. 함수 프로토타입은 올바르지만, 인덱스 n 에 있는 매개변수의 유형이 잘못되어 올바른 유형으로 강제 변환할 수 없었습니다.
QAxScriptManager::call(): 이 함수를 제공하는 스크립트가 없습니다
인트로스펙션(introspection) 기능을 제공하지 않는 엔진(예: ActivePython 또는 ActivePerl)을 통해 제공되는 함수를 호출하려고 합니다. 해당 QAxScript 객체에서 직접 함수를 호출해야 합니다.
ActiveQt 프레임워크도 참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.