#import のディレクティブ (C++)
C++ 仕様
タイプ ライブラリからの情報を取り込むために使用します。タイプ ライブラリの内容の大部分は COM インターフェイスについて説明する C++ クラスに変換されます。
#import "filename" [attributes]
#import <filename> [attributes]
パラメーター
filename
タイプ ライブラリをインポートするように指定します。filename は次のいずれかです :タイプ ライブラリを.olb など.tlb 含むファイル名または .dll ファイル。キーワード ファイル : は各ファイル名の前に記述できます。
タイプ ライブラリのコントロールの progid。キーワードprogid: は各 progid を指定できます。次に例を示します。
#import "progid:my.prog.id.1.5"
progids の詳細については ローカリゼーション ID とバージョン番号の指定 を参照してください。
64 ビット オペレーティング システムのクロス コンパイラでコンパイルする場合コンパイラが 32 ビットレジストリハイブのみ読める次の点に注意してください。64 ビットのタイプ ライブラリがビルドおよび登録するためにネイティブ 64 ビット コンパイラを使用する場合があります。
タイプ ライブラリのライブラリの ID。キーワードlibid: は各ライブラリ ID の前に記述できます。次に例を示します。
#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
progid: に適用される lcid 指定しない場合 規則 は任意のバージョンを libid: に適用されます。
実行可能 (.exe) ファイル。
ライブラリ (.dll) ファイルのタイプ ライブラリのリソース (.ocx など)。
タイプ ライブラリを保持する複合ドキュメント。
LoadTypeLib API によって認識できるそのほかの形式。
attributes
一つ以上の #import の属性 。複数の属性を指定するときは、空白またはコンマで区切ります。次に例を示します。#import "..\drawctl\drawctl.tlb" no_namespace, raw_interfaces_only
または
#import "..\drawctl\drawctl.tlb" no_namespace raw_interfaces_only
解説
ファイル名の検索順序
ファイル名は フォルダー仕様にオプションで指定されます。ファイル名が既存のファイル名を付ける必要があります。2 個の構文形式の違いはパスが不完全に指定するとプリプロセッサがタイプ ライブラリのファイルを検索する順序です。
構文形式 |
動作 |
---|---|
引用符フォーム |
次に (プリプロセッサに #include) そのファイルが格納されるファイル #import のステートメントを含むディレクトリとタイプ ライブラリ ファイルを最初に指示するファイルのディレクトリ検索します。プリプロセッサは以下のパスに沿ってを検索します。 |
山かっこのフォーム |
プリプロセッサに次のパスに沿ってタイプ ライブラリ ファイルを検索するように指示します :
|
ローカリゼーション ID とバージョン番号の指定
progid を指定する場合progid のローカリゼーション ID およびバージョン番号を指定できます。次に例を示します。
#import "progid:my.prog.id" lcid("0") version("4.0)
ローカリゼーション ID を指定するprogid は次の規則に基づいて選択されます :
ローカリゼーション ID が 1 であるが使用されます。
複数のローカリゼーション ID がある場合バージョン番号 09または 409 では最初の 1 が使用されます。
複数のローカリゼーション IDおよびそれらが 09または 409 でない場合最後の 1 が使用されます。
バージョン番号を指定しない場合最新バージョンが使用されます。
インポートすることによって作成されたヘッダー ファイル
#importC++ ソース・コードのタイプ ライブラリの内容を構築するには 2 とおりのヘッダー ファイルを作成します。主ヘッダー ファイルはMicrosoft (MIDL) Interface Definition Language) コンパイラによって追加のコンパイラ生成されたコードとデータが生成される構文に似ています。 主ヘッダー ファイル に .TLH の拡張子とタイプ ライブラリと同じ基本名があります。セカンダリ ヘッダー ファイルに .TLI の拡張子を持つタイプ ライブラリと同じ基本名があります。これはコンパイラが生成したメンバー関数の実装が含まれ主ヘッダー ファイル (#include) が含まれています。
byref のパラメーターを使用するディスパッチ インターフェイスのプロパティをインポートし#import は関数の プロパティ__declspec () ステートメントを生成しません。
ヘッダー ファイルには両方の /Fo (オブジェクト ファイルの名前の指定) オプションで指定された出力ディレクトリに配置されます。これらはコンパイラによって主ヘッダー ファイルが #include のディレクティブで指定されている読み込まれコンパイルされます。
次のコンパイラの最適化は #import のディレクティブがあります :
ヘッダー ファイルはタイプ ライブラリで作成された場合同じタイムスタンプが与えられます。
#import が処理されるときヘッダーが最新の場合コンパイラの最初のチェック。○または再作成する必要はありません。
#import のディレクティブでは簡易リビルドに参加するプリコンパイル済みヘッダー ファイルを作成できます。詳細についてはプリコンパイル済みヘッダー ファイルの作成 を参照してください。
主要なタイプ ライブラリのヘッダー ファイル
主要なタイプ ライブラリのヘッダー ファイルには7 種類のセクションで構成されています :
見出しの定型 : (ヘッダーで使用される標準マクロを定義する) のコメント#include のステートメント COMDEF.H などのそのほかのセットアップ情報で構成されます。
前方参照と定義型 : struct IMyInterfaceおよび typedef のような構造体の宣言で構成されます。
スマート ポインター宣言 : テンプレート クラス _com_ptr_t はインターフェイス ポインターをカプセル化しAddRef 解放 の QueryInterface の関数を呼び出す必要がなくなった場合スマート ポインターの実装です。また新しい COM オブジェクトの作成 CoCreateInstance の呼び出しを非表示にします。ここでは _com_ptr_t テンプレート クラス テンプレートの特殊化で COM インターフェイスの型定義を設定するにはマクロ _COM_SMARTPTR_TYPEDEF ステートメントを使用します。たとえばインターフェイス IMyInterface については.TLH ファイルが含まれています :
_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));
コンパイラが配置するを :
typedef _com_ptr_t<_com_IIID<IMyInterface, __uuidof(IMyInterface)> > IMyInterfacePtr;
型 IMyInterfacePtr は未加工のインターフェイス ポインターの代わりに IMyInterface* を使用できます。その結果IUnknown のさまざまなメンバー関数を呼び出す必要がありません
: Typeinfo の宣言 主に ITypeLib: GetTypeInfo によって返された個々の typeinfo の項目を公開するにはクラス定義やそのほかの項目で構成されます。このセクションではタイプ ライブラリの各 typeinfo は TYPEKIND の情報フォームの依存ファイルのヘッダーに反映されます。
(省略可能) 古い定義の GUID: GUID の名前付き定数の初期化を行います。これらはMIDL コンパイラによって生成されるようにしたフォーム CLSID_CoClass と IID_Interface の名前です。
セカンダリ タイプ ライブラリのヘッダーの #include のステートメントを指定します。
フッターの定型 : 現在 #pragma pack(pop) が含まれています。
すべてのセクションでは定型の見出しフッターの定型のセクションを除く元の IDL ファイルで ライブラリ のステートメントで指定された名前と名前空間で囲まれています。名前空間名に明示的な修飾または次のステートメントを含めることによってタイプ ライブラリのヘッダーの名前を使用できます :
using namespace MyLib;
ソース・コードの #import のステートメントの直後。
名前空間は #import の no_namespace のディレクティブの属性によって制限できます。ただし名前空間を抑制すると名前の競合が発生する場合があります。名前空間にはrename_namespace の属性で名前を変更できます。
コンパイラは現在処理しているタイプ ライブラリで必要なすべてのタイプ ライブラリの依存関係の完全パスを指定します。パスはコンパイラが各処理されたタイプ ライブラリに対して生成するタイプ ライブラリのヘッダー () .TLH にコメントの形式で書き込まれます。
タイプ ライブラリが他のタイプ ライブラリで定義されている型への参照を含める場合は.TLH ファイルは次の種類のコメントが含まれています :
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
#import のコメントの実際のファイル名をレジストリに格納されるように相互参照されたタイプ ライブラリの完全パスです。不明な型定義が原因のエラーが発生した場合は依存タイプ ライブラリにインポートする必要がある場合がありますかを確認するに .TLH のヘッダーにコメントをチェックします。考えられるエラーは構文エラー (たとえば構文C2146C2321)(C2501 が共有する区分の指定子)または (「 C2433 データ宣言では許可されない inline) .TLI ファイルのコンパイル中です。
必要があります。依存関係のコメントのどちらをシステム ヘッダーによって以外の場合はその提供されない依存タイプ ライブラリの #import のディレクティブの前にエラーを解決するに #import のあるディレクティブを指定する。
詳細についてはXML の #import 」を使用するとサポート技術情報の文書に「 #import ラッパー メソッド アクセス違反 Q242527 」 () または 「コンパイラ エラー発生する可能性があること (" Q269194)。MSDN ライブラリのメディアのサポート技術情報の文書はを参照してください。
#import の属性
#import にはオプションで一つ以上の属性を含めることができます。これらの属性はコンパイラがタイプ ライブラリのヘッダーの内容を変更します。バックス ラッシュ \() 記号が #import の単一のステートメントに追加の行を追加するために使用できます。次に例を示します。
#import "test.lib" no_namespace \
rename("OldName", "NewName")
詳細については、「#import の属性 (C++)」を参照してください。
終了 C++ 仕様