调用 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. 线程安全的无锁RingBuffer的实现【一个读线程,一个写线程】

    在程序设计中,我们有时会遇到这样的情况,一个线程将数据写到一个buffer中,另外一个线程从中读数据.所以这里就有多线程竞争的问题.通常的解决办法是对竞争资源加锁.但是,一般加锁的损耗较高.其实,对于 ...

  2. eclipse中git插件使用

    1,首先看下文件的几个工作区:Unstaged Changes(本地工作空间),Staged Changes(Add to Index操作之后代码存放的地方),Local Repository(本地仓 ...

  3. 用eclipse调试scala工程代码

    1,在scala工程下面执行命令:sbt -jvm-debug 9999 2,然后执行命令:run,程序就跑起来了 3,然后用eclipse工具导入scala工程. 4,最后配置调试信息,端口号跟上面 ...

  4. iOS全局变量的声明和使用

    在一个项目中,我们可能需要定义几个全局变量,在我们程序的任何位置都可以进行访问,提高我们的开发效率.在iOS中我们如何来实现呢?我们主要使用的是AppDelegate类来实现.如下: (1)AppDe ...

  5. [转]ORA-01555错误总结(二)

    原文地址:http://blog.csdn.net/oradh/article/details/25683769 这篇文章紧接着上一篇“ORA-01555错误总结(一)”,主要描述延迟块清除导致的OR ...

  6. 一场由SD卡引发的灾难_转

      注:此文章转自“https://user.qzone.qq.com/63915185/blog/1512562541”.   Flash里面的数据在使用过程中莫名改变或不翼而飞?程序丢失可能无法正 ...

  7. 有赞MySQL自动化运维之路—ZanDB

      有赞MySQL自动化运维之路—ZanDB 一.前言 在互联网时代,业务规模常常出现爆发式的增长.快速的实例交付,数据库优化以及备份管理等任务都对DBA产生了更高的要求,单纯的凭借记忆力去管理那几十 ...

  8. WaitForSingleObject函数的使用

    等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止.  WaitForSingleObject 函数 DWORD WaitForSingleObject( HANDLE hOb ...

  9. mysql导入sql脚本

    例如:我的用户名是root 密码是123 sql脚本存在C盘 名字为test.sql 数据库为test 有两种方法可以执行脚本 1:打开CMD输入以下命令(不需要转换目录)>mysql -u r ...

  10. Java对象创建的过程及对象的内存布局与访问定位

    这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符 ...