调用 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。幸运的是,这非常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 对象的更多相关文章
- Android NDK开发之Jni调用Java对象
https://my.oschina.net/zhiweiofli/blog/114064 通过使用合适的JNI函数,你可以创建Java对象,get.set 静态(static)和 实例(instan ...
- java双线程调用同一个对象+锁
两个线程(Thread)调用同一个对象(使用Runnable接口的对象ThreadJob) 误区:下一个线程会从上一个线程结束的地方开始 正解:如 public domd implements Run ...
- .Net Remoting 调用远程对象
根据需求,我们的系统必须以C/S方式构建,而且是三层架构,这样一来,就出现了服务器端和客户端通信的问题. 为了解决双方的通信问题,还要考虑效率.性能等方面,经过分析.试验,我们根据效率.移植.开发难易 ...
- 错误笔记 对象为null时调用改对象的方法会报错
对象为null时调用改对象的方法会报错
- 正确释放WORD对象(COM组件) COMException: 被调用的对象已与其客户端断开连接
本来form method=post本页面 修改为其他页面 action=save.aspx后没问题 其他问题可参考以下: 引自:http://topic.csdn.net/u/20090108/17 ...
- JavaScript的三种对话框是通过调用window对象的三个方法alert(),confirm()和prompt()
第一种:alert()方法 alert()方法是这三种对话框中最容易使用的一种,她可以用来简单而明了地将alert()括号内的文本信息显示在对话框中,我们将它称为警示对话框,要显示的信息放置在括号内, ...
- java反射调用某个对象的方法
// 反射调用某个对象的方法 public Object invokeMethod(Object methodObject, String methodName, Object[] args) thr ...
- 在调用self对象时,本类调用用Win32Info().collect()
import platform class Test: def test(self): func = getattr(self,'windows') func() @staticmethod def ...
- 42th 逻辑的连续性 取决于 细节的理解-------------我是个厨子:类的调用vs 对象调用方法
类的调用vs 对象调用方法 class Cook5: '''这是一个厨师的类''' # 类是一系列对象相同的特征与技能的结合体 # 用变量表示特征(属性) ...
随机推荐
- idea 设置字体
1.设置 ui字体 修改编辑器的字体(也就是代码的字体):设置-Editor-Color&Font,默认的scheme是不可以更改的,你需要save as,建立一个新的(名字可以随意写个,My ...
- 备份Android机上的照片
[本文出自天外归云的博客园] 一年一度的春节放假开始了,今天收拾柜子发现了一台上大学时候用的android机,里面有几百张当年的回忆. 写了个shell脚本遍历了下照片存放的路径,然后用一个pytho ...
- sublime Text2下安装php code sniffer插件
为了跟团队保持开发规范的一致性,需要安装sublime Text2的php code sniffer插件,之前是用的phpfmt插件,发现两个规范还是有点不一样,需要再安装php code sniff ...
- <要做股市赢家:杨百万>读书笔记
书在这里 和这里: 要注意的是,并不是政府每出台一个政策股价就要变.如果听到各种消息,市场却没有反应,就不要去做这个聪明人.有消息后应该密切关注市场反应,看成交量.价格的变化等等,再作决定.总之,关键 ...
- Java8中list转map
第一种: 取list中某2个字段作为Map的K,V public Map<Long, String> getIdNameMap(List<Account> accounts) ...
- FormWindowState.Maximized的陷阱
MDI父窗体下面有很多子窗体.子窗体打开时都是以FormWindowState.Maximized的属性打开的,但是结果部分如意,部分奇怪. 先贴上单实例的代码: static TestForm _s ...
- webbrowser获取无ID无Name控件并模拟点击
常见的获取控件并点击(自动登录): var txtUserID = wbsTask.Document.All["userName"]; var txtPsd = wbsTask.D ...
- c# 反射取其他项目的资源文件
反射获取其他项目里面的资源文件. dll或exe里面 try { System.Reflection.Assembly dll = System.Reflection.Assembly.LoadFil ...
- mysql中varbinary、binary、char、varchar异同
binary 与 varbinary 类型和char与varchar类型是相似的,只是他们存储的是二进制数据,也就是说他们是包含字节流而不是字符流,他们有二进制字符的集合和顺序,他们的对比,排序是基于 ...
- CentOS7安装google chrome浏览器
1,下载离线包 rpm 2,rpm -ivh ** 报错: lsb_release被chrome依赖 libXss.so被chrome依赖 libappindicator3被chrome依赖 yum ...