`
izuoyan
  • 浏览: 9229496 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《COM技术内幕》FAQ

阅读更多

COM技术内幕》FAQ<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

sunshineormer@msn.com

读书问题一:

11章,分发接口与自动化P231

"自动化在许多不同的方面用开发人员编写的代码来代替编译器生成的代码"

请问这句话如何理解?

:

这句话没有问题:

大意是说,我们原先所写的应用,都是源码一级,需要经过编译器编译,才能执行,现在,用脚本语言来操作自动化接口,可以动态的完成相同的应用(其实是解释执行)。

一个简单的例子,你肯定没有Word的源码,如果你象用Word来生成一个针对于具体应用领域(比方说政府公文)的应用,你只能找有源码的公司来修改源码,以适应你的特殊需要。(微软听你的?)

但是,你可以用自动化接口来定制你的特定应用,用 VBA脚本来控制Word的自动化接口就可以完成。是的,解释执行是慢了些,但是,对你来说不用改源码,不用再去测试你修改的源码部分,不是更好吗?

读书问题二:

11章,分发接口与自动化P234

C++程序员想在运行时从头开始构造一个vtbl,那他可以完全自行决定如何构造。另一方面..."

这段话应如何理解?

答:

是的,一个VTBLE的生成是由你所用的编译器替你完成的,但是,如果你明白了 vtbl的构造过程,你可以仿制一个出来.

建议读 :com本质论 + inside c++ object model

要有很好的心理准备,啃硬骨头

读书问题三:

OleInitializeCoInitialize(Ex)这两个函数有什么区别?

P236倒数第六行有对OleInitialize的调用

答:

CoInitialize CoInitializeEx 是用来初始化COM运行环境的,就象练武的人在练武前先划了个圈,在圈里摆上了兵器()

OleInitialize是初始化Ole的运行环境,Ole是在Com的基础上作的扩展,是ActiveX运行的基础。就向是在刚才的圈子里撑起了个钢丝,要表演钢丝上的表演一样。

读书问题之四:

p208页:关于对point_default关键字的解释,看不懂)

1."point_default关键字地作用就是告诉MIDL编译器在没有为指针指定其它属性时应如何处理此指针”, “其它属性”都是些什么?

2. "在函数内部,不能为它们指定别名”,什么是别名?

答:

至于别名,是指midl语言中的typedef吧(非常抱歉,我对COM的调度部分没有太多的关注,只能简单回答,请你有了明确的答案后告诉我)。

读书问题之五:

p234最后一句:“当然用COM接口来实现IDispatch::Invoke也是可能的,请参阅图11-2。”

1. 用Com接口如何实现Invoke?

2. 图11-2中FooBar不是Com接口吧(没有IUnknown那三个函数).

答:

com是更好的C++,Com 的实现其实借鉴了很多C++的实现方式,比如,利用我前面所说的vtbl,

按照规定,我觉得我们不应该把 图11-2 的FooBar称为COM接口,但是,在广义的范围内,由于使用了vtbl,可以勉强认为他也是一个 COM接口,(如果作者非要这样讲的话 ^_^)

读书问题之六:

分发接口是Com接口(符合COM接口的定义吗)?它跟Invoke函数有何关系?如果不是Com接口,那么分发接口的定义是什么?

答:

分发接口可以是COM接口,也可以不是,这只是实现时的不同方式而已,分发接口是一个概念,内部应该包含两个数组,一个存放dispid与接口方法名称的对值(pair),一个存放的是dispid与接口方法指针(也就是函数指针)的对值。只要有这两部分我们就认为它是一个分发接口,至于是不是COM接口,那都无所谓。

Invoke的时候,需要提供dispid 和对应的参数,这样,就可以用利用分发接口的具体实现机制得到函数指针进行功能调用了。

读书问题之七:

p234第七行:“IDispatch::Invoke的一个实现所实现的函数集被称作一个分发接口,和dispinterface"Invoke是一个函数,怎么能够实现”函数集“?

Invoke函数跟分发接口之间是什么关系?

对于IDispatch::Invoke ,我们可以看一下它的运行过程

在调用Invoke之前,我们通过各种方式得到了一个dispid, (不要以为只有GetIDsOfNames才能得到,我曾经在一个组件里实现了根据状态不同动态的将可执行的dispid传出,然后在组件内提供了一个方法,ExecuteCmd(dispid),这样客户程序也可以动态执行组件的接口方法了)。接口的本质就是一组函数指针的数组,而dispid就是函数指针数组的索引(注意,只有实现IDispatch接口才有dispid),通过指定索引,我们可以得到指定的函数指针,这样我们可以用(*函数指针)(参数,参数…)的方式来调用具体的接口方法了。

“等等”我听见你在喊,“我们的参数是以数组的形式传进来的,而你用函数指针调用的时候是用参数列表的形式调用的,我要怎样才能实现它呢?”

是的,如果要你自己写一个Invoke的实现,光参数的压栈和类型处理就会累死你的,告诉你一个好办法,用msapi函数(DispCallFunc 或者 DispInvoke),或者用使用mfc/atl 对IDispatch实现的封装(mfc用的是一个helper ,Atl用的是IdispatchImpl 模版)

分发接口,是一个逻辑概念,是指有个地方存放了函数方法名和函数的指针,通过这个接口,你可以用指定的方法名来检索到函数的指针,最大的用处,是提供给脚本解释器使用。

分享到:
评论

相关推荐

    华为SAP HANA一体机技术FAQ.docx

    华为 SAP HANA 一体机技术 FAQ 华为 SAP HANA 一体机技术 FAQ 是一份详细的技术手册,它提供了关于华为 SAP HANA 一体机的详细信息,包括总体介绍、销售场景、技术架构、销售策略等方面的内容。 1.1 总体介绍 SAP...

    基于.NET技术的简易FAQ系统

    21世纪是网络的时代、信息的时代,随着现代信息技术的不断进步与发展,各行各业都在积极探索利用计算机网络开展网上交流,在很多网站上都可以看到FAQ,相当于一种在线帮助形式。一个优秀的网站,应该重视FAQ系统的设计。

    WAP页面及技术规范FAQ.doc

    **WAP页面及技术规范详解** WAP(Wireless Application Protocol)是一种专为移动设备设计的互联网协议,它允许用户通过手机等设备访问互联网服务。然而,由于不同手机制造商的微浏览器实现不一致,导致了标准和...

    英飞凌技术社区FAQ集锦

    英飞凌技术社区FAQ集锦是英飞凌技术社区整理的关于英飞凌微控制器(MCU)应用中的常见问题解答。英飞凌是一家全球领先的半导体解决方案供应商,其产品广泛应用于汽车、工业、通信等领域。MCU作为电子系统中的核心...

    华为OceanStor 9000技术FAQ.pdf

    华为OceanStor 9000技术FAQ OceanStor 9000是华为公司的一款NAS存储系统,旨在提供高性能、可靠性的文件服务。下面是OceanStor 9000技术FAQ中的一些重要知识点: 1. NAS系统:NAS(Network Attached Storage)是...

    FAQ-Man v1.05

    FAQ-Man 提供了一个直观的界面,允许用户输入问题和答案,这可能包括技术问题、产品使用指南、服务政策等常见疑问。通过预设的模板,用户可以选择不同的外观风格,使FAQ页面与他们的网站设计保持一致,提升用户体验...

    FAQ.zip_FAQ_在线FAQ制作_网站faq系统

    五、系统架构与技术选型 构建这样的在线FAQ系统,通常会采用前后端分离的架构。前端负责用户交互,可能使用React、Vue.js等现代JavaScript框架;后端处理业务逻辑和数据操作,可能选择Node.js、Python的Django或...

    可用于FAQ问答系统的语料集

    为了充分利用这个语料库,开发者需要使用合适的NLP工具和算法,如深度学习模型(如Transformer或BERT)、信息检索技术或者基于规则的方法。模型的训练通常涉及将问题映射到答案,而验证和测试集则用来度量模型的准确...

    Linux-FAQ.rar_FAQ

    Linux的开发文档,开发遇到的问题的FAQ,文档是Html形式

    基于深度学习的FAQ式问答系统源码+数据集(毕设项目).zip

    基于深度学习的FAQ式问答系统源码+数据集(毕设项目).zip基于深度学习的FAQ式问答系统源码+数据集(毕设项目).zip基于深度学习的FAQ式问答系统源码+数据集(毕设项目).zip基于深度学习的FAQ式问答系统源码+数据集(毕设...

    业务框架应用FAQ

    【业务框架应用FAQ详解】 业务框架是企业信息系统中用于组织和执行业务逻辑的重要组成部分,它为各类业务操作提供了一个清晰的结构。对于初学者来说,理解业务框架的应用可以帮助他们更好地掌握系统操作和流程设计...

    FAQ管理全源代码源码整理

    【标题】"FAQ管理全源代码源码整理"所涉及的知识点主要集中在FAQ管理系统的设计与实现上,这通常包括以下几个核心部分: 1. **FAQ架构设计**:一个完整的FAQ管理系统通常由前端用户界面、后端服务接口、数据库存储...

    javafaq javafaq javafaq

    序列化是Java提供的一种将对象的状态转换为字节流,以便存储到磁盘或者在网络中传输的技术。通过序列化,我们可以将对象持久化,即使程序结束,对象的状态也能被保存下来,下次启动时可以恢复。 当一个类实现了`...

    FAQ管理全源代码.rar_FAQ_faq java

    【标题】"FAQ管理全源代码.rar"是一个包含完全源代码的压缩文件,专注于实现一个FAQ(常见问题解答)管理系统。这个系统是用Java语言编写的,因此它被标记为"faq_java",表明它是Java开发者的一个实用工具,用于创建...

    EAS系统部署常见问题2013 FAQ

    EAS 系统部署常见问题 FAQ 是一份详细的技术文档,为 EAS 产品支持部刘习红所编写,旨在解决 EAS 系统部署过程中常见的问题。该文档涵盖了 EAS 系统安装、部署的各种问题的处理,适用于现场实施同事和总部研发人员。...

    MTK功能机常见问题总结FAQ

    ### MTK功能机常见问题总结FAQ及开发指南 在移动通信技术不断发展的今天,功能机仍然占据着一定的市场份额。MediaTek(简称MTK)作为移动通信领域的领军企业之一,为功能机提供了强大的技术支持。本文将根据给定的...

    MTK平台:FAQ总结

    2. FAQ文档主要回答在源码开发过程中可能出现的技术问题,帮助开发者更好地理解和利用MTK平台。 3. 由于是早期文档,开发者在参考时需要注意文档信息可能不完全符合当前MTK平台的最新状况,有必要更新或校验信息。 ...

    MTK android faq大全

    请注意,由于文件的部分内容存在OCR技术错误,下文将尽可能地对相关知识点进行准确解释。 ### 知识点一:MTK Android调试基础 MTK作为知名的芯片设计公司,提供了大量的Android设备解决方案。在进行MTK Android设备...

    UNIX Programming FAQ 中文版

    美国镜像站点设在http://www.whitefang.com/unix/faq_toc.html。 这篇文档可以用FTP的方式自主机rtfm.mit.edu和其众多镜像站点的news.answers 归档中找到(译者注:URL是ftp://rtfm.mit.edu/pub/faqs/unix-faq/...

Global site tag (gtag.js) - Google Analytics