# import 指示詞 (C++)
C + + 特定
用來將型別程式庫的資訊。 型別程式庫的內容會轉換成 C++ 類別,大部分描述的 COM 介面。
#import "filename" [attributes]
#import <filename> [attributes]
參數
filename
指定要匯入型別程式庫。 filename可以是下列其中一項:包含型別程式庫,如.olb、.tlb 或.dll 檔的檔案名稱。 關鍵字, 檔案:,可以在前加上的每個檔名。
Progid 的型別程式庫中的控制項。 關鍵字, progid:,可以在前面各 progid。 例如:
#import "progid:my.prog.id.1.5"
如需 progid 的詳細資訊,請參閱指定的當地語系化 ID 和版本號碼。
請注意當使用交互編譯器在 64 位元作業系統上編譯,編譯器會讀取 32 位元登錄 hive。 您可以使用原生 64 位元編譯器,以建置並登錄的 64 位元的型別程式庫。
程式庫 ID 的型別程式庫。 關鍵字, libid:,可以在前加上的每個程式庫 id。 例如:
#import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")
如果您沒有指定版本或 lcid 之後, 規則 ,會套用到 progid: 也會套用至 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
備註
檔案名稱的搜尋順序
檔名選擇性地加上指定的目錄。 檔名必須命名現有的檔案。 兩種語法形式之間的差異是前置處理器搜尋的順序的型別程式庫檔案時完全指定的路徑。
語法格式 |
動作 |
---|---|
引號括住的表單 |
指示來找尋檔案所在的目錄中的第一個型別程式庫檔案的前置處理器#import陳述式,然後在包含的任何檔案的目錄 (#include) 檔案。 前置處理器會搜尋沿著路徑,如下所示。 |
角括弧表單 |
指示要搜尋的型別程式庫檔案,以及下列路徑的前置處理器:
|
指定的當地語系化 ID 和版本號碼
當您指定的 progid 時,您也可以指定 progid 的當地語系化 ID 和版本的號碼。 例如:
#import "progid:my.prog.id" lcid("0") version("4.0)
如果您未指定的當地語系化 ID,progid 是選擇根據下列規則:
如果只有一個當地語系化 ID,則會使用痛。
如果有一個以上的當地語系化 ID,會使用第一個加上 0、 9 或 409 的版本號碼。
如果有一個以上的當地語系化 ID,而其中沒有一個是 0、 9 或 409,會使用最後一個。
如果您未指定版本號碼,則會使用最新版本。
匯入所建立的標頭檔
#import會建立兩個重新建構的型別程式庫內容,在 C++ 原始程式碼中的標頭檔。 主要的標頭檔很類似,由 Microsoft 介面定義語言 (MIDL) 編譯器,但與其他編譯器所產生的程式碼和資料所產生。 主標頭檔為型別程式庫中,具有相同的主檔名加上。TLH 的副檔名。 第二個標頭檔具有基底型別程式庫中,名稱相同。TLI 的副檔名。 包含編譯器所產生的成員函式,實作,並且將包含 (#include) 中的主標頭檔。
如果匯入使用 byref 參數的分配介面屬性,# import 將不會產生 __declspec (屬性) 函式的陳述式。
這兩個標頭檔會放在 /Fo (物件檔案名稱)] 選項指定輸出目錄中。 然後閱讀及編譯器所編譯,如同已命名的主標頭檔#include指示詞。
下列編譯器最佳化會隨附#import指示詞:
標頭檔建立時,會指定為型別程式庫相同的時間戳記。
當#import已處理,編譯器會先檢查標頭是否存在,且是最新狀態。 如果是的話,接著就不需要重新建立。
#import指示詞也加入了最少重建,而且可以放置在先行編譯標頭檔。 請參閱建立先行編譯標頭檔如需詳細資訊。
主要型別程式庫的標頭檔
主要型別程式庫的標頭檔包含七個章節:
標題未定案: 包含註解, #include COMDEF 的陳述式。H (會定義標頭中的一些標準的巨集,使用),以及其他雜項設定資訊。
向前參考和 typedef: 組成結構宣告,例如struct IMyInterface和 typedef。
智慧型指標宣告: 樣板類別**_com_ptr_t是封裝介面指標,並且不需要呼叫的智慧指標實作AddRef**, 發行, QueryInterface函式。 此外,它會隱藏CoCreateInstance呼叫中建立新的 COM 物件。 本章節會使用巨集的陳述式 _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 常數的初始設定。 這些是形式的名稱 CLSID_CoClass 和 IID_Interface,就像那些 MIDL 編譯器所產生的。
#include第二個型別程式庫的標頭的陳述式。
頁尾樣板: 目前包含#pragma pack(pop)。
所有的區段,除了標題重複使用及頁尾樣板區段,以所指定的名稱時,由命名空間中庫在原始的 IDL 檔中的陳述式。 外顯的限定性條件的命名空間名稱或是包含下列陳述式,您可以使用型別程式庫的標頭的名稱:
using namespace MyLib;
之後立即#import在原始程式碼中的陳述式。
可以隱藏命名空間,是使用 no_namespace 屬性的#import指示詞。 不過,隱藏命名空間可能會導致名稱衝突。 命名空間也能藉由重新命名 rename_namespace 屬性。
編譯器會提供目前正在處理的型別程式庫所需的任何型別程式庫相依性的完整路徑。 路徑被寫入,在表單中的註解,型別程式庫的標頭 (。TLH) 編譯器會產生每個已處理的型別程式庫。
如果型別程式庫包含參考型別定義在其他型別程式庫,然後在。TLH 檔案將包含下列形式的註解:
//
// Cross-referenced type libraries:
//
// #import "c:\path\typelib0.tlb"
//
在實際的檔名#import註解是儲存在登錄中的交互參考的型別程式庫的完整路徑。 如果您遇到錯誤,是因為找不到型別定義,請檢查位於開頭的註解。若要查看哪些相依型別程式庫的 TLH 可能需要先匯入。 可能的錯誤是語法錯誤 (例如,C2143,C2146,C2321),C2501 (是否遺漏 decl 規範),或 C2433 ('內嵌' 資料宣告上不允許) execute 權限。TLI 檔案。
您必須決定何種相依性的註解不對否則提供根據系統的標頭,然後提供#import指示詞之前,有些時候#import指示詞相依型別程式庫來解決錯誤。
如需詳細資訊,請參閱知識庫文件"# import 包裝函式方法可能會造成存取違規 」 (Q242527) 或 「 編譯器錯誤,當您使用 # import 使用 XML 」 (Q269194)。 您可以在 MSDN Library 媒體上,或者在尋找 Knowledge Base 文件https://support.microsoft.com/support/。
# import 屬性
#import選擇性地包含一或多個屬性。 這些屬性會告訴編譯器来修改的型別程式庫的標頭的內容。 反斜線 (\) 符號可用來包含額外的線條,在單一#import陳述式。 例如:
#import "test.lib" no_namespace \
rename("OldName", "NewName")
如需詳細資訊,請參閱 # import 屬性 (C++)。
結束 C++ 特定