Qt에서 ActiveX 컨트롤과 COM 사용
QAxContainer 모듈은 ActiveQt 프레임워크의 일부입니다. 이 모듈은 ActiveX 컨트롤의 컨테이너 역할을 하는 QWidget 서브클래스( QAxWidget)와 시각적이지 않은 COM 객체에 쉽게 액세스하는 데 사용할 수 있는 QObject 서브클래스( QAxObject)를 구현하는 라이브러리를 제공합니다. 이러한 클래스를 사용하여 임베드된 COM 개체를 스크립팅하는 것은 QAxScript, QAxScriptManager 및 QAxScriptEngine 클래스를 통해 가능하며, 일련의 도구를 사용하면 프로그래밍 방식으로 COM 개체에 쉽게 액세스할 수 있습니다.
이 모듈은 6개의 클래스로 구성됩니다.
- QAxBase COM 객체 또는 ActiveX 컨트롤을 초기화하고 액세스하는 API를 제공하는 추상 클래스입니다.
- QAxObject COM 개체를 래핑하는 QObject 을 제공합니다.
- QAxWidget 는 ActiveX 컨트롤을 래핑하는 QWidget 입니다.
- QAxScriptManager, QAxScript 및 QAxScriptEngine 은 Windows 스크립트 호스트에 대한 인터페이스를 제공합니다.
표준 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에 전달합니다.
객체 API에 액세스하기
ActiveQt는 COM 객체에 Qt API를 제공하고, COM 데이터 타입을 Qt에 상응하는 것으로 대체합니다.
COM 객체에서 API를 호출하는 방법은 네 가지가 있습니다:
- C++ 네임스페이스 생성
- 이름별 호출
- 스크립트 엔진을 통해
- 네이티브 COM 인터페이스 사용
C++ 네임스페이스 생성
액세스하려는 유형 라이브러리에 대한 C++ 네임스페이스를 생성하려면 dumpcpp 도구를 사용합니다. 사용하려는 유형 라이브러리에서 이 도구를 수동으로 실행하거나 애플리케이션의 .pro
파일에 있는 TYPELIBS
변수에 유형 라이브러리를 추가하여 빌드 시스템에 통합할 수 있습니다:
TYPELIBS = file.tlb
dumpcpp가 타입 라이브러리에 있는 모든 API를 노출하지 못할 수도 있습니다.
생성된 C++ 클래스를 통해 객체 API에 액세스하려면 결과 헤더 파일을 코드에 포함하세요. 자세한 내용은 Qutlook 예제를 참조하세요.
이름별 호출
QAxBase::dynamicCall() 및 QAxBase::querySubObject(), QObject::setProperty() 및 QObject::property() API를 사용하여 이름을 통해 COM 개체의 메서드 및 속성을 호출할 수 있습니다. 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(): 이 함수를 제공하는 스크립트가 없습니다.
인트로스펙션을 제공하지 않는 엔진(예: ActivePython 또는 ActivePerl)을 통해 제공되는 함수를 호출하려고 합니다. 해당 QAxScript 객체에서 직접 함수를 호출해야 합니다.
ActiveQt 프레임워크도참조하세요 .
© 2025 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.