#import 지시문(C++)

C++ 특정

형식 라이브러리의 정보를 통합하는 데 사용됩니다. 형식 라이브러리의 콘텐츠는 대부분 COM 인터페이스를 설명하는 C++ 클래스로 변환됩니다.

구문

#import "filename" [attributes]
<#import 파일 이름> [특성]

매개 변수

filename
가져올 형식 라이브러리를 지정합니다. 파일 이름은 다음 종류 중 하나일 수 있습니다.

  • .olb, .tlb 또는 .dll 파일 등 형식 라이브러리를 포함하는 파일 이름입니다. 키워드(keyword) file:각 파일 이름 앞에 섰습니다.

  • 형식 라이브러리에서 제어의 progid입니다. 키워드(keyword) progid:각 progid보다 우선할 수 있습니다. 예시:

    #import "progid:my.prog.id.1.5"
    

    progids에 대한 자세한 내용은 지역화 ID 및 버전 번호 지정을 참조 하세요.

    64비트 운영 체제에서 32비트 크로스 컴파일러를 사용하는 경우 컴파일러는 32비트 레지스트리 하이브만 읽을 수 있습니다. 64비트 형식 라이브러리를 빌드 및 등록하기 위해 네이티브 64비트 컴파일러를 사용할 수도 있습니다.

  • 형식 라이브러리의 라이브러리 ID입니다. 키워드(keyword) 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 는 스마트 포인터입니다. 인터페이스 포인터를 캡슐화하고 , ReleaseQueryInterface 함수를 호출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_CoClassIID_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++ 특정

참고 항목

전처리기 지시문
컴파일러 COM 지원