#import ディレクティブ (C++)#import directive (C++)

C++のみC++ Specific

タイプ ライブラリからの情報を組み込むために使用します。Used to incorporate information from a type library. タイプ ライブラリの内容は、ほとんどが COM インターフェイスを記述した C++ クラスに変換されます。The content of the type library is converted into C++ classes, mostly describing the COM interfaces.

構文Syntax

#import"filename" [属性] #import "filename" [attributes]
#import<ファイル名属性> ][#import <filename> [attributes]

パラメーターParameters

/dbfilename
インポートするタイプ ライブラリ ファイルを指定します。Specifies the type library to import. ファイル名は、次のいずれかの種類にすることができます。The filename can be one of the following kinds:

  • .olb、.tlb、.dll ファイルなど、タイプ ライブラリを含むファイルの名前。The name of a file that contains a type library, such as an .olb, .tlb, or .dll file. キーワードfile:は、各ファイル名の前に置くことができます。The keyword, file:, can precede each filename.

  • タイプ ライブラリのコントロールの progid。The progid of a control in the type library. キーワードprogid:は、各 progid の前に置くことができます。The keyword, progid:, can precede each progid. 例えば:For example:

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

    Progid の詳細については、「ローカライズ ID とバージョン番号の指定」を参照してください。For more on progids, see Specifying the Localization ID and Version Number.

    64ビットオペレーティングシステムで32ビットクロスコンパイラを使用する場合、コンパイラは32ビットレジストリハイブのみを読み取ることができます。When you use a 32-bit cross compiler on a 64-bit operating system, the compiler can only read the 32-bit registry hive. ネイティブ 64 ビット コンパイラを使用して、64 ビットのタイプ ライブラリをビルドおよび登録した方がよい場合があります。You might want to use the native 64-bit compiler to build and register a 64-bit type library.

  • タイプ ライブラリのライブラリ ID。The library ID of the type library. キーワードlibid:は、各ライブラリ ID の前に置くことができます。The keyword, libid:, can precede each library ID. 例えば:For example:

    #import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
    

    またはversion libid: progid:を指定しない場合は、に適用される規則がにも適用されます。lcidIf you don't specify version or lcid, the rules applied to progid: are also applied to libid:.

  • 実行可能 (.exe) ファイル。An executable (.exe) file.

  • タイプライブラリリソース (.ocx など) を含むライブラリ (.dll) ファイル。A library (.dll) file containing a type library resource (such as an .ocx).

  • タイプ ライブラリを保持する複合ドキュメント。A compound document holding a type library.

  • Loadtypelib API で認識できるその他のファイル形式。Any other file format that can be understood by the LoadTypeLib API.

アトリビュートattributes
1つまたは複数の#import 属性One or more #import attributes. 複数の属性を指定するときは、空白またはコンマで区切ります。Separate attributes with either a space or comma. 例:For example:

#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only

- または --or-

#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only

RemarksRemarks

ファイル名の検索順序Search order for filename

ファイル名の前にディレクトリ指定が必要です。filename is optionally preceded by a directory specification. そのファイル名は既存のファイルの名前であることが必要です。The file name must name an existing file. 2 つの構文形式間の違いは、パスの指定が不完全であるときに、プリプロセッサがタイプ ライブラリ ファイルを検索する順序です。The difference between the two syntax forms is the order in which the preprocessor searches for the type library files when the path is incompletely specified.

構文形式Syntax form アクションAction
引用符形式Quoted form プリプロセッサに対して、 #importステートメントを含むファイルのディレクトリにあるタイプライブラリファイルを検索するように指示します。次に、そのファイル#includeが含まれているファイル () のディレクトリで、そのファイルを検索します。Instructs the preprocessor to look for type library files first in the directory of the file that contains the #import statement, and then in the directories of whatever files include (#include) that file. プリプロセッサは次のパスに従って検索します。The preprocessor then searches along the paths shown below.
山かっこ形式Angle-bracket form プリプロセッサに次のパスに従ってタイプ ライブラリ ファイルを検索するように指示します。Instructs the preprocessor to search for type library files along the following paths:

1.環境PATH変数のパスリスト1. The PATH environment variable path list
2.環境LIB変数のパスリスト2. The LIB environment variable path list
3./Iコンパイラオプションで指定されたパス。ただし、コンパイラは、 no_registry属性を使用して別のタイプライブラリから参照されたタイプライブラリを検索します。3. The path specified by the /I compiler option, except it the compiler is searching for a type library that was referenced from another type library with the no_registry attribute.

ローカライズ ID とバージョン番号を指定しますSpecify the localization ID and version number

progid を指定するときに、progid のローカリゼーション ID とバージョン番号も指定できます。When you specify a progid, you can also specify the localization ID and version number of the progid. 例えば:For example:

#import "progid:my.prog.id" lcid("0") version("4.0)

ローカライズ ID を指定しない場合、progid は次の規則に従って選択されます。If you don't specify a localization ID, a progid is chosen according to the following rules:

  • ローカライズ ID が1つしかない場合は、その ID が使用されます。If there's only one localization ID, that one is used.

  • 複数のローカライズ ID がある場合は、バージョン番号が0、9、または409の最初の ID が使用されます。If there's more than one localization ID, the first one with version number 0, 9, or 409 is used.

  • ローカライズ ID が複数あり、そのいずれも0、9、または409ではない場合は、最後の ID が使用されます。If there's more than one localization ID and none of them are 0, 9, or 409, the last one is used.

  • バージョン番号を指定しない場合は、最新のバージョンが使用されます。If you don't specify a version number, the most recent version is used.

インポートによって作成されるヘッダーファイルHeader files created by import

#importは、ソースコード内のC++タイプライブラリの内容を再構築する2つのヘッダーファイルを作成します。#import creates two header files that reconstruct the type library contents in C++ source code. プライマリヘッダーファイルは、Microsoft インターフェイス定義言語 (MIDL) コンパイラによって生成されるものと似ていますが、コンパイラによって生成されるコードとデータが追加されています。The primary header file is similar to the one produced by the Microsoft Interface Definition Language (MIDL) compiler, but with additional compiler-generated code and data. プライマリヘッダーファイルには、タイプライブラリと同じ基本名とが含まれています。TLH 拡張。The primary header file has the same base name as the type library, plus a .TLH extension. セカンダリ ヘッダー ファイルには、タイプ ライブラリと同じ基本名と .TLI 拡張子が付けられます。The secondary header file has the same base name as the type library, with a .TLI extension. このファイルは、コンパイラが生成したメンバー関数の実装を格納しており、プライマリ ヘッダー ファイルにインクルード (#include) されます。It contains the implementations for compiler-generated member functions, and is included (#include) in the primary header file.

パラメーターを使用byrefするディスパッチインターフェイスプロパティをインポートする場合、 #importは関数の__declspec (property)ステートメントを生成しません。If importing a dispinterface property that uses byref parameters, #import doesn't generate a __declspec(property) statement for the function.

両方のヘッダーファイルは、 /fo (name object file)オプションで指定された出力ディレクトリに配置されます。Both header files are placed in the output directory specified by the /Fo (name object file) option. 次に、プライマリヘッダーファイルに#includeディレクティブで名前が付けられているかのように、コンパイラによって読み取られ、コンパイルされます。They're then read and compiled by the compiler as if the primary header file was named by a #include directive.

次のコンパイラの最適化には、 #importディレクティブが付属しています。The following compiler optimizations come with the #import directive:

  • ヘッダー ファイルは作成時にタイプ ライブラリと同じタイムスタンプが付けられます。The header file, when created, is given the same timestamp as the type library.

  • #Importが処理されると、コンパイラはまずヘッダーが存在し、最新の状態であるかどうかを確認します。When #import is processed, the compiler first checks if the header exists and is up-to-date. そうであれば、再作成する必要はありません。If yes, then it doesn't need to be re-created.

#Importディレクティブも最小リビルドに関与し、プリコンパイル済みヘッダーファイルに配置できます。The #import directive also participates in minimal rebuild and can be placed in a precompiled header file. 詳細については、「プリコンパイル済みヘッダーファイルの作成」を参照してください。For more information, see Creating precompiled header files.

プライマリタイプライブラリのヘッダーファイルPrimary type library header file

プライマリ タイプ ライブラリのヘッダー ファイルは、7 つのセクションで構成されます。The primary type library header file consists of seven sections:

  • 見出しの定型:コメント、 #include comdef のステートメントで構成されます。H (ヘッダーで使用される標準マクロを定義する) とその他の設定情報。Heading boilerplate: Consists of comments, #include statement for COMDEF.H (which defines some standard macros used in the header), and other miscellaneous setup information.

  • 前方参照と typedef:struct IMyInterfaceや typedef などの構造体の宣言で構成されます。Forward references and typedefs: Consists of structure declarations such as struct IMyInterface and typedefs.

  • スマートポインターの宣言:このテンプレートクラス_com_ptr_tはスマートポインターです。Smart pointer declarations: The template class _com_ptr_t is a smart pointer. インターフェイスポインターをカプセル化することで、 AddRef Release、、およびQueryInterfaceの各関数を呼び出す必要がなくなります。It encapsulates interface pointers, and eliminates the need to call AddRef, Release, and QueryInterface functions. また、新しい COM CoCreateInstanceオブジェクトを作成するときに呼び出しを非表示にします。It also hides the CoCreateInstance call when creating a new COM object. このセクションでは、マクロ_COM_SMARTPTR_TYPEDEFステートメントを使用して、 _com_ptr_tテンプレートクラスのテンプレートの特殊化として COM インターフェイスの typedef を確立します。This section uses the macro statement _COM_SMARTPTR_TYPEDEF to establish typedefs of COM interfaces as template specializations of the _com_ptr_t template class. たとえば、インターフェイスIMyInterfaceの場合は、のようになります。TLH ファイルには次のものが含まれます。For example, for interface IMyInterface, the .TLH file will contain:

    _COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
    

    コンパイラが次のように展開します。which the compiler will expand to:

    typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
    

    IMyInterfacePtr 型は、未加工のインターフェイス ポインター IMyInterface* の代わりに使用できます。Type IMyInterfacePtr can then be used in place of the raw interface pointer IMyInterface*. そのため、さまざまなIUnknownメンバー関数を呼び出す必要はありません。Consequently, there's no need to call the various IUnknown member functions

  • Typeinfo 宣言:は、主にによってITypeLib:GetTypeInfo返される個々の typeinfo 項目を公開するクラス定義とその他の項目で構成されます。Typeinfo declarations: Primarily consists of class definitions and other items exposing the individual typeinfo items returned by ITypeLib:GetTypeInfo. このセクションでは、型ライブラリの各 typeinfo は、TYPEKIND 情報に応じてヘッダーに反映されます。In this section, each typeinfo from the type library is reflected in the header in a form dependent on the TYPEKIND information.

  • 省略可能な旧形式の GUID の定義:名前付き GUID 定数の初期化を含みます。Optional old-style GUID definition: Contains initializations of the named GUID constants. これらの名前の形式CLSID_CoClassIID_Interface、MIDL コンパイラによって生成されるものと同様です。These names have the form CLSID_CoClass and IID_Interface, similar to the ones generated by the MIDL compiler.

  • セカンダリ タイプ ライブラリ ヘッダーの #include ステートメント。#include statement for the secondary type library header.

  • フッターの定型:現在は#pragma pack(pop)が含まれています。Footer boilerplate: Currently includes #pragma pack(pop).

見出しの定型句とフッターの定型句を除くすべてのセクションは、元の IDL ファイルのlibraryステートメントで指定された名前を持つ名前空間で囲まれています。All sections, except the heading boilerplate and footer boilerplate section, are enclosed in a namespace with its name specified by the library statement in the original IDL file. タイプライブラリヘッダーの名前は、名前空間名を使用した明示的な修飾によって使用できます。You can use the names from the type library header by an explicit qualification using the namespace name. または、次のステートメントを含めることができます。Or, you can include the following statement:

using namespace MyLib;

ソースコード内の #importステートメントの直後。immediately after the #import statement in the source code.

名前空間は、 #importディレクティブのno_namespace) 属性を使用して抑制できます。The namespace can be suppressed by using the no_namespace) attribute of the #import directive. ただし、名前空間を抑制すると、名前の競合が発生する場合があります。However, suppressing the namespace may lead to name collisions. 名前空間は、 rename_namespace属性によって名前を変更することもできます。The namespace can also be renamed by the rename_namespace attribute.

コンパイラは、現在処理しているタイプライブラリに必要なタイプライブラリの依存関係への完全なパスを提供します。The compiler provides the full path to any type library dependency required by the type library it's currently processing. パスは、処理されたタイプ ライブラリごとにコンパイラが生成するタイプ ライブラリ ヘッダー (.TLH) に、コメントの形式で記述されます。The path is written, in the form of comments, into the type library header (.TLH) that the compiler generates for each processed type library.

タイプ ライブラリに他のタイプ ライブラリで定義された型への参照が含まれている場合は、.TLH ファイルに次の種類のコメントが含まれます。If a type library includes references to types defined in other type libraries, then the .TLH file will include comments of the following sort:

//
// Cross-referenced type libraries:
//
//  #import "c:\path\typelib0.tlb"
//

#Importコメント内の実際のファイル名は、レジストリに格納されている、相互参照されるタイプライブラリの完全なパスです。The actual filename in the #import comment is the full path of the cross-referenced type library, as stored in the registry. 型定義が存在しないことが原因でエラーが発生した場合は、の先頭にあるコメントを確認してください。TLH を使用すると、最初にインポートする必要がある依存タイプライブラリを確認できます。If you encounter errors that are caused by missing type definitions, check the comments at the head of the .TLH to see which dependent type libraries may need to be imported first. .TLI ファイルのコンパイル中に考えられるエラーは、構文エラー (C2143、C2146、C2321 など)、C2501 (decl-specifier の欠落)、または C2433 (データ宣言子内でのインライン禁止) です。Likely errors are syntax errors (for example, C2143, C2146, C2321), C2501 (missing decl-specifiers), or C2433 ('inline' not permitted on data declaration) while compiling the .TLI file.

依存関係エラーを解決するには、システムヘッダーによって提供されない依存関係コメントを確認し、依存タイプライブラリの #importディレクティブの前にある時点で #importディレクティブを指定します。To resolve dependency errors, determine which of the dependency comments aren't otherwise provided for by system headers, and then provide an #import directive at some point before the #import directive of the dependent type library.

#import 属性#import attributes

#importには、必要に応じて1つ以上の属性を含めることができます。#import can optionally include one or more attributes. これらの属性は、コンパイラにタイプ ライブラリ ヘッダーの内容を変更するように指示します。These attributes tell the compiler to modify the contents of the type-library headers. 円記号 ( \ ) を使用すると、1つの #importステートメントに追加の行を含めることができます。A backslash (\) symbol can be used to include additional lines in a single #import statement. 例えば:For example:

#import "test.lib" no_namespace \
   rename("OldName", "NewName")

詳細については、「属性の #import」を参照してください。For more information, see #import attributes.

特定C++の終了END C++ Specific

関連項目See also

プリプロセッサディレクティブPreprocessor directives
コンパイラの COM サポートCompiler COM support