#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.


#import "filename" [attributes]
#import <filename> [attributes]


インポートするタイプ ライブラリ ファイルを指定します。Specifies the type library to import. ファイル名次のいずれかを指定できます。filename can be one of the following:

  • .olb、.tlb、.dll ファイルなど、タイプ ライブラリを含むファイルの名前。The name of a file that contains a type library, such as an .olb, .tlb, or .dll 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 ビット レジストリ ハイブのみ読み取り可能になることに注意してください。Note that when compiling with a cross compiler on a 64-bit operating system, the compiler will be able to read only 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")

    バージョンまたは lcid を指定しない場合、ルールに適用されるprogid: にも適用されますlibid: します。If you do not specify version or lcid, the rules that are 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 .ocx).

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

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

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


ファイル名の検索順序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 that 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 (additional include directories) 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 とバージョン番号を指定します。Specifying 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 do not specify a localization ID, a progid is chosen according to the following rules:

  • ローカリゼーション ID が 1 つしかない場合、その ID が使用されます。If there is only one localization ID, that one is used.

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

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

  • バージョン番号を指定しない場合、最も新しいバージョンが使用されます。If you do not 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 that 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 (プロパティ) 関数のステートメント。If importing a dispinterface property that uses byref parameters, #import will not generate __declspec(property) statement for the function.

ヘッダー ファイルは両方とも、/Fo (オブジェクト ファイルを指定) オプションで指定された出力ディレクトリに保存されます。Both header files are placed in the output directory specified by the /Fo (name object file) option. それらのファイルは、プライマリ ヘッダー ファイルが #include ディレクティブで指定されているように、コンパイラによって読み取られてコンパイルされます。They are 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 does not need to be re-created.

#Importディレクティブも最小リビルドに参加し、プリコンパイル済みヘッダー ファイルに配置することができます。The #import directive also participates in minimal rebuild and can be placed in a precompiled header file. 参照してくださいプリコンパイル済みヘッダー ファイルの作成詳細についてはします。See Creating Precompiled Header Files for more information.

プライマリ タイプ ライブラリ ヘッダー ファイルPrimary Type Library Header File

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

  • 見出しの定型句。コメントから成る#includeCOMDEF のステートメント。(これは、ヘッダーで使用される標準マクロを定義します) 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インターフェイス ポインターをカプセル化しを呼び出す必要がなくなりますスマート ポインターの実装は、 AddRefReleaseQueryInterface関数。Smart pointer declarations: The template class _com_ptr_t is a smart-pointer implementation that encapsulates interface pointers and eliminates the need to call AddRef, Release, QueryInterface functions. また、新しい COM オブジェクトの作成時に CoCreateInstance 呼び出しを隠します。In addition, it hides the CoCreateInstance call in creating a new COM object. このセクションでは、マクロのステートメントを使用して_COM_SMARTPTR_TYPEDEFのテンプレート特殊化である COM インターフェイスの typedef を確立するために、 _com_ptr_tテンプレート クラス。This section uses macro statement _COM_SMARTPTR_TYPEDEF to establish typedefs of COM interfaces to be 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 is no need to call the various IUnknown member functions

  • Typeinfo 宣言:クラス定義とその他のアイテムによって返される個々 の typeinfo 項目を公開するは、主にITypeLib:GetTypeInfoします。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 are names of the form CLSID_CoClass and IID_Interface, similar to those generated by the MIDL compiler.

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

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

見出し定型句およびフッターの定型コード」セクションを除く、すべてのセクションは、名前空間内で指定された名前で囲まれた、library元の IDL ファイル内のステートメント。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 either by an explicit qualification with the namespace name or by including the following statement:

using namespace MyLib;

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

使用して、名前空間を抑制することができます、 no_namespace) の属性、 #importディレクティブ。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 is 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 due to 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依存のディレクティブエラーを解決するタイプ ライブラリ。You must determine which of the dependency comments are not otherwise provided for by system headers and then provide an #import directive at some point before the #import directive of the dependent type library to resolve the errors.

#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.

END C 固有の仕様END C++ Specific

関連項目See also

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