调用 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. Excel工作记录表制作

    前言:我们一天中的工作可能特别忙.事情特别多,这时候你就要像CPU一样去调度.去执行任务,但总要有个地方记录你的执行情况,这就需要我们自己去记录和管理了,下面是使用excel的简单管理记录方式,下图是 ...

  2. hdu3191+hdu1688(求最短路和次短路条数,模板)

    hdu3191题意:求出次短路的长度和条数 #include<iostream> #include<cstdio> #include<cstring> #inclu ...

  3. ZooKeeper管理分布式环境中的数据

    Reference: http://www.cnblogs.com/wuxl360/p/5817549.html 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它 ...

  4. Faiss教程:索引(1)

    索引是faiss的关键知识,我们重点介绍下. 索引方法汇总 有些索引名,我就不翻译了,根据英文名去学习更准确. 索引名 类名 index_factory 主要参数 字节数/向量 精准检索 备注 精准的 ...

  5. 基于jQuery全屏相册插件zoomVisualizer

    基于jQuery全屏相册插件zoomVisualizer.这是一款基于jquery ui实现的相册插件,支持隐藏显示相册缩略图,支持左右箭头切换图片,支持放大缩及缩小图片.效果图如下: 在线预览    ...

  6. eclipse多个项目保存到gitee上一个仓库中

    自己练习创建到多个项目,想同步到gitee上一个仓库中. 1. 首先在gitee上创建项目springtest 2. 在eclipse默认项目存放到地方创建文件夹springtest,用来同步gite ...

  7. android开发(33) 让 actionbar 透明2

    让 actionbar 的背景 透明 我需要一个 透明的actionbar ,找到如下方法实现: 1. 首先,设置ActionBar 浮动到主界面上来. 2. 然后,设置ActionBar的背景色,透 ...

  8. WebRTC网关服务器单端口方案实现

    标准WebRTC连接建立流程 这里描述的是Trickle ICE过程,并且省略了通话发起与接受的信令部分.流程如下: 1) WebRTC A通过Signal Server转发SDP OFFER到Web ...

  9. js学习(三)-使用大括号({ })语法创建无类型对象

    //----------------------js代码------------------- var user = { name:'tom', say:function(){ console.log ...

  10. linux 解压压缩大全

    eoiioe   linux下解压命令大全 .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)——— ...