首页 > 代码库 > 调用 COM 对象

调用 COM 对象

调用 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。幸运的是,这很简单,所有要做的是把包含 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()