#import 지시문(C++)
C++ 특정
형식 라이브러리의 정보를 통합하는 데 사용됩니다. 형식 라이브러리의 콘텐츠는 대부분 COM 인터페이스를 설명하는 C++ 클래스로 변환됩니다.
구문
#import "filename" [attributes]
<#import 파일 이름> [특성]
매개 변수
filename
가져올 형식 라이브러리를 지정합니다. 파일 이름은 다음 종류 중 하나일 수 있습니다.
.olb, .tlb 또는 .dll 파일 등 형식 라이브러리를 포함하는 파일 이름입니다. 키워드는
file:
각 파일 이름 앞에 표시할 수 있습니다.형식 라이브러리에서 제어의 progid입니다. 키워드는
progid:
각 progid 앞에 표시될 수 있습니다. 예시:#import "progid:my.prog.id.1.5"
progids에 대한 자세한 내용은 지역화 ID 및 버전 번호 지정을 참조 하세요.
64비트 운영 체제에서 32비트 크로스 컴파일러를 사용하는 경우 컴파일러는 32비트 레지스트리 하이브만 읽을 수 있습니다. 64비트 형식 라이브러리를 빌드 및 등록하기 위해 네이티브 64비트 컴파일러를 사용할 수도 있습니다.
형식 라이브러리의 라이브러리 ID입니다. 키워드는
libid:
각 라이브러리 ID 앞에 섰습니다. 예시:#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
version
또는lcid
를 지정하지 않은 경우에 적용되는 규칙에progid:
도libid:
에 적용됩니다.실행 파일(.exe)입니다.
형식 라이브러리 리소스(예: .ocx)를 포함하는 라이브러리(.dll) 파일입니다.
형식 라이브러리를 보유하는 복합 문서입니다.
LoadTypeLib API에서 이해할 수 있는 다른 모든 파일 형식입니다.
attributes
하나 이상의 #import 특성입니다. 공백이나 쉼표를 사용하여 특성을 구분합니다. 예시:
#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
또는
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
설명
파일 이름 검색 순서
파일 이름은 필요에 따라 디렉터리 사양 앞에 섰습니다. 이 파일 이름은 기존 파일의 이름이어야 합니다. 두 구문 형식의 차이는 경로가 불완전하게 지정되어 있을 경우 전처리기가 형식 라이브러리 파일을 검색하는 순서입니다.
구문 형식 | 작업 |
---|---|
따옴표로 묶인 형식 | 전처리기에서 먼저 #import 문을 포함하는 파일의 디렉터리에서 형식 라이브러리 파일을 찾은 다음 해당 파일이 포함된 파일(#include )의 디렉터리에서 찾도록 지시합니다. 그런 다음 전처리기는 아래 표시된 경로를 따라 검색합니다. |
꺾쇠 괄호 형식 | 전처리기가 다음 경로에 따라 형식 라이브러리 파일을 검색하도록 지시합니다. 1. PATH 환경 변수 경로 목록2. LIB 환경 변수 경로 목록3. 컴파일러가 no_registry 특성을 사용하여 다른 형식 라이브러리에서 참조된 형식 라이브러리를 검색한다는 점을 제외하고 /I 컴파일러 옵션으로 지정된 경로입니다. |
지역화 ID 및 버전 번호 지정
progid를 지정할 때 progid의 지역화 ID 및 버전 번호를 지정할 수도 있습니다. 예시:
#import "progid:my.prog.id" lcid("0") version("4.0)
지역화 ID를 지정하지 않으면 다음 규칙에 따라 progid가 선택됩니다.
지역화 ID가 하나만 있는 경우 해당 ID가 사용됩니다.
지역화 ID가 둘 이상인 경우 버전 번호가 0, 9 또는 409인 첫 번째 ID가 사용됩니다.
지역화 ID가 둘 이상 있고 0, 9 또는 409가 아닌 경우 마지막 ID가 사용됩니다.
버전 번호를 지정하지 않으면 최신 버전이 사용됩니다.
가져오기로 만든 헤더 파일
#import C++ 소스 코드에서 형식 라이브러리 콘텐츠를 다시 구성하는 두 개의 헤더 파일을 만듭니다. 기본 헤더 파일은 MIDL(Microsoft Interface Definition Language) 컴파일러에서 생성되는 파일과 비슷하지만 추가 컴파일러에서 생성된 코드 및 데이터를 포함합니다. 기본 헤더 파일의 기본 이름은 형식 라이브러리와 같고 . TLH 확장. 보조 헤더 파일은 .TLI 확장명을 가진 형식 라이브러리와 같은 기본 이름을 가집니다. 이 파일은 컴파일러에서 생성된 멤버 함수에 대한 구현을 포함하고 기본 헤더 파일에 포함(#include
)되어 있습니다.
매개 변수를 사용하는 byref
dispinterface 속성을 가져오는 경우 #import 함수에 대한 __declspec(property) 문을 생성하지 않습니다.
두 헤더 파일은 모두 /Fo(이름 개체 파일) 옵션으로 지정된 출력 디렉터리에 배치됩니다. 그런 다음, 기본 헤더 파일의 이름이 지시문에 의해 #include
명명된 것처럼 컴파일러에서 읽고 컴파일합니다.
다음 컴파일러 최적화는 #import 지시문과 함께 제공됩니다.
헤더 파일은 만들어질 때 형식 라이브러리와 동일한 타임스탬프를 제공받습니다.
#import 처리되면 컴파일러는 먼저 헤더가 존재하고 최신 상태인지 확인합니다. 그렇다면 다시 만들 필요가 없습니다.
또한 #import 지시문은 최소 다시 작성에 참여하며 미리 컴파일된 헤더 파일에 배치할 수 있습니다. 자세한 내용은 미리 컴파일된 헤더 파일 만들기를 참조 하세요.
기본 형식 라이브러리 헤더 파일
기본 형식 라이브러리 헤더 파일은 다음과 같은 7개의 섹션으로 구성됩니다.
제목 상용구: 주석, COMDEF.H용
#include
문(헤더에 사용되는 일부 표준 매크로 정의) 및 다른 기타 설정 정보로 구성됩니다.정방향 참조 및 typedef:
struct IMyInterface
및 typedef와 같은 구조체 선언으로 구성됩니다.스마트 포인터 선언: 템플릿 클래스
_com_ptr_t
는 스마트 포인터입니다. 인터페이스 포인터를 캡슐화하고 ,Release
QueryInterface
함수를 호출AddRef
할 필요가 없습니다. 또한 새 COM 개체를CoCreateInstance
만들 때 호출을 숨깁니다. 이 섹션에서는 매크로 문을_COM_SMARTPTR_TYPEDEF
사용하여 COM 인터페이스의 typedef를 _com_ptr_t 템플릿 클래스의 템플릿 특수화로 설정합니다. 예를 들어 인터페이스IMyInterface
의 경우 . TLH 파일에는 다음이 포함됩니다._COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
컴파일러는 다음과 같이 확장됩니다.
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
IMyInterfacePtr
형식은 원시 인터페이스 포인터IMyInterface*
대신 사용할 수 있습니다. 따라서 다양한IUnknown
멤버 함수를 호출할 필요가 없습니다.Typeinfo 선언: 주로 클래스 정의 및 반환된 개별 typeinfo 항목을 노출하는 기타 항목으로
ITypeLib:GetTypeInfo
구성됩니다. 이 섹션에서 형식 라이브러리의 각 typeinfo는TYPEKIND
정보에 종속적인 형식의 헤더에 반영됩니다.선택적 기존 형식 GUID 정의: 명명된 GUID 상수의 초기화를 포함합니다. 이러한 이름에는 MIDL 컴파일러에서 생성한 것과 유사한 형식
CLSID_CoClass
IID_Interface
이 있습니다.보조 형식 라이브러리 헤더에 대한
#include
문입니다.바닥글 상용구: 현재
#pragma pack(pop)
을 포함합니다.
제목 상용구 및 바닥글 상용구 섹션을 제외한 모든 섹션은 원래 IDL 파일의 문으로 지정된 library
이름을 가진 네임스페이스로 묶입니다. 네임스페이스 이름을 사용하여 형식 라이브러리 헤더의 이름을 명시적 한정으로 사용할 수 있습니다. 또는 다음 문을 포함할 수 있습니다.
using namespace MyLib;
소스 코드의 #import 문 바로 뒤입니다.
#import 지시문의 no_namespace) 특성을 사용하여 네임스페이 스를 표시하지 않을 수 있습니다. 하지만 네임스페이스를 표시하지 않으면 이름이 충돌될 수 있습니다. 네임스페이스의 이름을 rename_namespace 특성으로 바꿀 수도 있습니다.
컴파일러는 현재 처리 중인 형식 라이브러리에 필요한 모든 형식 라이브러리 종속성에 대한 전체 경로를 제공합니다. 경로는 컴파일러가 처리된 각 형식 라이브러리에 대해 생성하는 형식 라이브러리 헤더(.TLH)에 주석 형식으로 기록됩니다.
형식 라이브러리에 다른 형식 라이브러리에 정의된 형식에 대한 참조가 포함된 경우 .TLH 파일에 다음과 같은 유형의 주석이 포함됩니다.
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
#import 주석의 실제 파일 이름은 레지스트리에 저장된 대로 상호 참조된 형식 라이브러리의 전체 경로입니다. 형식 정의 누락으로 인해 발생하는 오류가 발생하는 경우 머리글의 주석을 확인합니다. 먼저 가져와야 할 종속 형식 라이브러리를 확인하기 위한 TLH입니다. .TLI 파일을 컴파일하는 동안 발생 가능성이 높은 오류는 구문 오류(예: C2143, C2146, C2321), C2501(decl-specifiers 누락) 또는 C2433(데이터 선언에 '인라인'이 허용되지 않음)입니다.
종속성 오류를 해결하려면 시스템 헤더에서 제공하지 않는 종속성 주석을 확인한 다음 종속 형식 라이브러리의 #import 지시문 앞에 #import 지시문을 제공합니다.
#import 특성
#import 필요에 따라 하나 이상의 특성을 포함할 수 있습니다. 이러한 특성은 컴파일러가 형식 라이브러리 헤더의 콘텐츠를 수정하도록 지시합니다. 백슬래시(\) 기호를 사용하여 단일 #import 문에 추가 줄을 포함할 수 있습니다. 예시:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
자세한 내용은 #import 특성을 참조 하세요.
END C++ 특정