调用 COM 对象





大多数 Windows 程序猿都熟悉组件对象模型(Component Object Model,COM)。在某程度上。.NET 框架 就是为了替换 COM,可是。系统仍然保留了这个功能。可能就是为了我们的不时之需。

Windows 中很多编程接口都公开为 COM 对象,尽管,如今越来越多地有了 .NET 框架等效的可托管对象。但仍有一些并没有等效的可托管对象;另外,另一些开发商出售的软件是通过 COM 公开编程接口的。

设计 .NET 框架就是为了可以和 COM 进行非常好地互操作的,因此,调用 COM 组件一般是相当简单的。调用 COM 组件总是通过可托管的包装(wrapper)完毕的,由它处理调用非托管的代码。生成包装使用工具 TlbImp.exe,称为类型库导入器(Type Library Importer)随 .NET SDK 一起发行。





注意

能够在 http://msdn2.microsoft.com/en-us/library/tt0cf3sx(VS.80).aspx 上找到很多其它有关工具 TlbImp.exe 的相关内容。





然而。虽然有 TlbImp.exe。可是,假设你发现须要 COM 组件时,首先应该去检查是否有开发商提供了可托管的包装。称为首选的互操作程序集(Primary Interop Assemblies)。很多其它有关首选的互操作程序集的内容。參见下一节“使用 COM 风格的编程接口”。

可是。有时还是须要直接使用 TlbImp.exe。幸运的是,这非常easy。全部要做的是把包括 COM 组件的 .dll 的路径传给 TlbImp.exe。可托管的包装就产生在当前文件夹下。假设想为 Microsoft Speech API 创建可托管的包装,就使用以下的命令:





tlbimp "C:\Program Files\Common Files\Microsoft Shared\Speech\sapi.dll"









注意:TlbImp.exe 有两个命令行开关:

/out:控制产生的可托管的包装的文件名称和位置;

/keyfile:提供键去签名输出的程序集。





产生的 .dll 是一个 .NET 程序集,能够像不论什么的 .NET 程序集一样使用,在 fsc.exe 命令中用开关 –r 进行引用。这个命令另一个实用的副产品,假设编程接口没有非常好的文档,能够用程序集浏览器,比方 Reflector,我们在第十二章中讨论过,能够找出很多其它有关这个编程接口的结构。

之后。我能说的最坏的事情,就是你可能会发现这些程序集的结构与 COM 模型的命令结构有点不同平常,因此,不能与大多数的 .NET 程序集不共享同样的命名转换。你会发现。在这个程序集中的全部类,都有一固定的后缀 Class,每个类都提供一个单独的接口:这就是COM 对象的唯一要求。以下的样例演示怎样包装 Microsoft Speech API,我们在前面的样例中使用过:





open SpeechLib





let main() =

  // create an new instance of a com class

  // (these almost always end with "Class")

  let voice = new SpVoiceClass()

  // call a method Speak, ignoring the result

  voice.Speak("Hello world", SpeechVoiceSpeakFlags.SVSFDefault) |> ignore





do main()

调用 COM 对象的更多相关文章

  1. Android NDK开发之Jni调用Java对象

    https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...

  2. java双线程调用同一个对象+锁

    两个线程(Thread)调用同一个对象(使用Runnable接口的对象ThreadJob) 误区:下一个线程会从上一个线程结束的地方开始 正解:如 public domd implements Run ...

  3. .Net Remoting 调用远程对象

    根据需求,我们的系统必须以C/S方式构建,而且是三层架构,这样一来,就出现了服务器端和客户端通信的问题. 为了解决双方的通信问题,还要考虑效率.性能等方面,经过分析.试验,我们根据效率.移植.开发难易 ...

  4. 错误笔记 对象为null时调用改对象的方法会报错

    对象为null时调用改对象的方法会报错

  5. 正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接

    本来form method=post本页面 修改为其他页面 action=save.aspx后没问题 其他问题可参考以下: 引自:http://topic.csdn.net/u/20090108/17 ...

  6. JavaScript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()

    第一种:alert()方法 alert()方法是这三种对话框中最容易使用的一种,她可以用来简单而明了地将alert()括号内的文本信息显示在对话框中,我们将它称为警示对话框,要显示的信息放置在括号内, ...

  7. java反射调用某个对象的方法

    // 反射调用某个对象的方法 public Object invokeMethod(Object methodObject, String methodName, Object[] args) thr ...

  8. 在调用self对象时,本类调用用Win32Info().collect()

    import platform class Test: def test(self): func = getattr(self,'windows') func() @staticmethod def ...

  9. 42th 逻辑的连续性 取决于 细节的理解-------------我是个厨子:类的调用vs 对象调用方法

    类的调用vs 对象调用方法   class Cook5:    '''这是一个厨师的类'''        # 类是一系列对象相同的特征与技能的结合体        # 用变量表示特征(属性)    ...

随机推荐

  1. Python3机器学习—Tensorflow数字识别实践

    [本文出自天外归云的博客园] Windows下Anaconda+Tensorflow环境部署 1. 安装Anaconda. 2. 开始菜单 > 所有程序 > Anaconda 3 (64- ...

  2. tf.Variable

    tf.Variable __init__( initial_value=None, trainable=True, collections=None, validate_shape=True, cac ...

  3. 基于jquery结婚电子请柬特效素材

    分享基于jquery结婚电子请柬特效素材总共包含3个部分,第一部分是开着小轿车缓缓进入场景,第二部分是相册,第三部分是祝福墙.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...

  4. 李炎恢的课程中心(JQUERY视频)

    http://edu.51cto.com/lecturer/user_id-3987533-page-2.html

  5. 【Unity】角色沿路线移动/朝着目标移动

    先在场景中放置一连串物体作为角色移动路线的关键点,可以把关键点的触发器Trigger拉得大一些方便角色接触到(如酷跑/赛车类项目可以把关键点的触发器做成拦截整个道路的墙面形状).让角色从开始位置朝着第 ...

  6. idea mac快捷键

    mac快捷键 alt+f7查找变量方法使用的地方 F3添加书签 Ctrl + O快捷覆写方法 Alt + F3 添加书签标识 command + F3 显示书签 command + Shift + A ...

  7. [算法]谷歌笔试题:Beautiful Numbers

    题目描述 思路 这道题就是在说,由多个1组成的数是beautiful的,现在想求出r进制中的r,使得给出的数字转换成r进制,得到beautiful的数字,如果有多种方式转换,那么取1的个数最多的那种情 ...

  8. XML(五)dom4j增删改查

    book2.xml <? xml version="1.0" encoding="UTF-8"?> <书架> <书> < ...

  9. 【javascript】分享一款经典的日期控件 My97DatePicker

    最近在做平台项目,其中有用到日期选择,相对于 jqueryui 的 datepicker 我更喜欢 My97DatePicker. 理由 体积小,相对于 jqueryui 的 datepicker 的 ...

  10. jQuery(五):文本操作

    text()可以获取或设置元素的文本内容.例如: 示例: <!DOCTYPE html> <html lang="en"> <head> < ...