C++编程->import函数

C++ #import 指令详解
本文详细介绍了C++中的#import指令及其使用方法。#import指令可以从类型库文件中导入信息,并转换为C++类,以描述COM接口。文章还解释了#import的不同语法格式及如何指定文件路径,同时提供了关于属性设置的指南。

#import指令用于从一个类型库中结合信息。该类型库的内容被转换为C++类,主要用于描述COM界面。

语法

#import "文件名" [属性]

#import <文件名> [属性]

属性:

属性1,属性2,...

属性1 属性2 ...

文件名是一个包含类型库信息的文件的名称。一个文件可为如下类型之一:

* 一个类型库(.TLB或.ODL)文件。

* 一个可执行(.EXE)文件。

* 一个包含类型库资源(如.OCX)的库文件(.DLL)。

* 一个包含类型库的复合文档。

* 其它可被LoadTypeLib API支持的文件格式。

文件名之前可以有一个目录规格。文件名必须是一个已存在文件的名称。两种格式的区别是当路径未完全说明时,预处理器检索类型库文件的顺序不同。

动作

语法格式


引号格式 这种格式让预处理器首先搜索与包含#import语句的文件同一目录的类型库文件,然后在所有包括(#include)该文件的目录中搜索,最后在如下路径中搜索

尖括号格式 这种格式指示预处理器沿以下路径搜索类型库文件

编译器在以下目录中搜索已命名的文件:

1. PATH环境变量路径表。

2. LIB环境变量路径表。

3. 用/I(额外的包括目录)编译器选项指定的路径。#import可以任选地包含一个或多个属性。这些属性使编译器改变类型库头文件的内容。一个反斜杠(\)符可用在一个单一的#import语句中包含额外的行,例如:

#import "test.lib" no_namespace \

rename("OldName","NewName")

#import属性列出如下:

excludehigh_method_prefixhigh_property_prefixesimplementation_onlyinclude(...)inject_statementnamed_guidsno_auto_excludeno_implementationno_namespaceraw_dispinterfacesraw_interfaces_onlyraw_method_prefixraw_native_typesraw_property_prefixesrenamerename_namespace

  #import指令可创建两个在C++源代码中重构类型库内容的头文件,第一个头文件和用Microsoft接口定义语言(MIDL)编译器生成的头文件类似,但有额外的编译器生成代码和数据。第一个头文件与类型库有相同的基本名,其扩展名为.TLH。第二个头文件也有与类型库相同的基本名,其扩展名为.TLI。它包括了编译器生成成员函数的实现,且被包含在(#include)的第一个头文件内。

  两个头文件都在用/Fo(命名对象文件)选项指定的输出目录中。随后它们被读出和编译,就像第一个头文件被#include指令命名一样。

以下是伴随#import指令的编译器优化:

* 头文件被创建时,将被分配与类库相同的时间标志。

* 处理#import时,编译器首先测试头文件是否存在,是否过期。若条件为真,就不需重新创建。

* 编译器延迟对于OLE子系统的初始化,直到碰到第一个#import命令。

#import指令也可参与最小重建且可被置于一个预编译头文件中。

基本类型库头文件

基本类型库头文件由七个部分组成:

1. 头部固定正文:由注释、COMDEF.H(定义用在头部的一些标准宏)的#include语句和其它繁杂的安装信息组成。

2.前向引用和类型定义:由象struct IMyinterface之类的结构说明和用于一些TKIND_ALIAS项的类型定义组成。

3.灵敏指针说明:模块类_com_ptr_t是一个封装接口指针和消除调用AddRef、Release和QueryInterface函数需求的灵敏指针实现。此外,它隐藏了创建一个新COM对象中的CoCreateInstance调用。此部分采用宏语句_COM_SMARTPTR_TYPEDEF将COM接口的类型定义创建为_com_ptr_t模板类的模板特例化。例如,对于界面IFoo,.TLH文件包含有:

_COM_SMARTPTR_TYPEDEF(IFoo,_ _uuidof(IFoo));

编译器将其扩展为:type def _com_ptr_t<_com_IIID<IFoo,_ _uuidof(IFoo) >> IFooPtr;

类型IFooPtr可以用在原始的界面指针IFoo*的地方。结果,就不需调用各种IUnknown成员函数。

4. 类型信息(typeinfo)说明:主要由类定义和其它项组成,这些项说明由ITyptLib:GetTypeInfo

在不同的编程语言中,`->` 符号有着不同的作用: ### PHP 在PHP里,`->` 是“插入式解引用操作符”,它是调用由引用传递参数的子程序的方法,其功能和在Perl或C++中类似。以下是一个简单的解引用例子: ```php <?php class MyClass { public $property = 'Hello, World!'; public function myMethod() { return $this->property; } } $obj = new MyClass(); echo $obj->property; // 访问对象属性 echo $obj->myMethod(); // 调用对象方法 ?> ``` ### C语言 在C语言中,当处理结构体指针时会用到 `->` 符号。结构体也是一种数据类型,定义一个结构体后,结构体中的变量可以被该结构体定义的变量访问。若使用结构体指针访问结构体成员,就需要用 `->` 符号。示例如下: ```c #include <stdio.h> // 定义一个结构体 struct Person { char name[50]; int age; }; int main() { struct Person p1 = {"John", 25}; struct Person *ptr = &p1; // 使用 -> 访问结构体成员 printf("Name: %s\n", ptr->name); printf("Age: %d\n", ptr->age); return 0; } ``` ### Java 在Java 8及以后的版本中,`->` 是Lambda表达式的一部分,用于定义一个匿名函数。Lambda表达式可以让代码更简洁,常用于函数式接口。示例如下: ```java import java.util.Arrays; import java.util.List; public class LambdaExample { public static void main(String[] args) { List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); // 使用Lambda表达式遍历列表 names.forEach(name -> System.out.println(name)); } } ```
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值