#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 位注册表项时,请注意,。您可能希望使用本机 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
    

备注

文件名的搜索命令

文件名 (可选) 在目录规范前面。文件名必须命名现有文件。两种语法形式之间的区别是预处理器搜索该类型库文件的顺序,当路径不完全指定时。

语法形式

操作

带引号的窗体

指示预处理器查找类型库文件首先在包含 #import 语句文件的目录,然后在目录中包含的任何文件 (#include) 该文件。预处理器沿如下所示的路径然后搜索。

角度括号窗体

指示预处理器搜索类型沿下列路径的库文件:

  1. 路径 环境变量路径列表。

  2. lib 环境变量路径列表。

  3. /I (附加的包含目录) 编译器选项指定的路径,但编译器搜索与 no_registry 属性的另一个类型库引用的类型库。

指定本地化 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) (midl) 编译器,但是,与其他编译器生成的代码和数据。主头文件 具有基本名称和类型库相同,以及 .TLH 扩展。辅助头文件的基名称与 .TLI 扩展的类型库相同,。它在主头文件包含编译器生成的成员函数的实现以及包括 (#include)。

如果导入使用 byref 参数的调度接口特性, #import 不会生成功能的 declspec(appdomain)属性) 语句。

两个头文件在 /Fo (名称的对象文件) 选项指定的输出目录放置。它们由编译器然后读取并生成,就象主要头文件由 #include 指令名为的。

下列编译器优化附带 #import 指令:

  • 头文件,那么,当创建,给定时间戳和类型库相同。

  • 当 #import 处理,编译器首先会查看,如果该标头存在且最新。如果为,则不需要重新创建。

#import 指令在预编译头文件也参与最小重新生成,并可将。请参见 创建预编译头文件 有关更多信息。

8etzzkb6.collapse_all(zh-cn,VS.110).gif主要类型库头文件

主要类型库头文件包含七个部分:

  • 标题的:包含注释、 #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_CoClassIID_Interface的名称,类似于 MIDL 编译器生成的文件。

  • 辅助类型的库头#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 的 head 发现哪个相关类型库可能需要先导入。可能的错误是语法错误 (例如, C2143、 C2146, C2321), C2501 (是否缺少的非阶级化说明符),或者 C2433 (“在数据声明不允许的 inline),在生成 .TLI 文件时。

必须确定依赖项注释对于由系统头尚未否则提供了相关类型之前然后提供 #import 指令库的 #import 指令解决错误。

有关更多信息,请参见知识库文章 “#import 包装方法可能会导致访问冲突” (Q242527) 或 “编译器错误,当您使用 XML 的 #import”时 (Q269194)。可以查找 MSDN Library 媒体的知识库文章或 https://support.microsoft.com/support/

#import 特性

#import 可以选择包含一个或多个特性。这些属性通知编译器修改类型库头文件的内容。杠 (\) 符号在单个 #import 可以使用语句包括附加的行。例如:

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

有关更多信息,请参见 #import特性(C++)

结束 C++ 特定

请参见

参考

预处理器指令

编译器COM支持