《COM技术内幕》FAQ

COM技术内幕》FAQ

 

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 模版)

 

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

 

      

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
<p> <span style="font-size:14px;color:#337FE5;">【为什么学爬虫?】</span> </p> <p> <span style="font-size:14px;">       1、爬虫入手容易,但是深入较难,如何写出高效率的爬虫,如何写出灵活性高可扩展的爬虫都是一项技术活。另外在爬虫过程中,经常容易遇到被反爬虫,比如字体反爬、IP识别、验证码等,如何层层攻克难点拿到想要的数据,这门课程,你都能学到!</span> </p> <p> <span style="font-size:14px;">       2、如果是作为一个其他行业的开发者,比如app开发,web开发,学习爬虫能让你加强对技术的认知,能够开发出更加安全的软件和网站</span> </p> <p> <br /> </p> <span style="font-size:14px;color:#337FE5;">【课程设计】</span> <p class="ql-long-10663260"> <span> </span> </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 一个完整的爬虫程序,无论大小,总体来说可以分成三个步骤,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 网络请求:模拟浏览器的行为从网上抓取数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据解析:将请求下来的数据进行过滤,提取我们想要的数据。 </li> <li class="" style="font-size:11pt;color:#494949;"> 数据存储:将提取到的数据存储到硬盘或者内存中。比如用mysql数据库或者redis等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 那么本课程也是按照这几个步骤循序渐进的进行讲解,带领学生完整的掌握每个步骤的技术。另外,因为爬虫的多样性,在爬取的过程中可能会发生被反爬、效率低下等。因此我们又增加了两个章节用来提高爬虫程序的灵活性,分别是: </p> <ol> <li class="" style="font-size:11pt;color:#494949;"> 爬虫进阶:包括IP代理,多线程爬虫,图形验证码识别、JS加密解密、动态网页爬虫、字体反爬识别等。 </li> <li class="" style="font-size:11pt;color:#494949;"> Scrapy和分布式爬虫:Scrapy框架、Scrapy-redis组件、分布式爬虫等。 </li> </ol> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 通过爬虫进阶的知识点我们能应付大量的反爬网站,而Scrapy框架作为一个专业的爬虫框架,使用他可以快速提高我们编写爬虫程序的效率和速度。另外如果一台机器不能满足你的需求,我们可以用分布式爬虫让多台机器帮助你快速爬取数据。 </p> <p style="font-size:11pt;color:#494949;">   </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> 从基础爬虫到商业化应用爬虫,本套课程满足您的所有需求! </p> <p class="ql-long-26664262" style="font-size:11pt;color:#494949;"> <br /> </p> <p> <br /> </p> <p> <span style="font-size:14px;background-color:#FFFFFF;color:#337FE5;">【课程服务】</span> </p> <p> <span style="font-size:14px;">专属付费社群+定期答疑</span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"><br /> </span> </p> <p> <br /> </p> <p class="ql-long-24357476"> <span style="font-size:16px;"></span> </p>
套餐中一共包含5门程序员必学的数学课程(共47讲) 课程1:《零基础入门微积分》 课程2:《数理统计与概率论》 课程3:《代码学习线性代数》 课程4:《数据处理的最优化》 课程5:《马尔可夫随机过程》 哪些人适合学习这门课程? 1)大学生,平时只学习了数学理论,并未接触如何应用数学解决编程问题; 2)对算法、数据结构掌握程度薄弱的人,数学可以让你更好的理解算法、数据结构原理及应用; 3)看不懂大牛代码设计思想的人,因为所有的程序设计底层逻辑都是数学; 4)想学习新技术,如:人工智能、机器学习、深度学习等,这门课程是你的必修课程; 5)想修炼更好的编程内功,在遇到问题时可以灵活的应用数学思维解决问题。 在这门「专为程序员设计的数学课」系列课中,我们保证你能收获到这些: ①价值300元编程课程大礼包 ②应用数学优化代码的实操方法 ③数学理论在编程实战中的应用 ④程序员必学的5大数学知识 ⑤人工智能领域必修数学课 备注:此课程只讲程序员所需要的数学,即使你数学基础薄弱,也能听懂,只需要初中的数学知识就足矣。 如何听课? 1、CSDNapp:我的-我的内容库-我的课程 2、程序员学院app:我的-学习 3、pc端CSDN官网:https://edu.csdn.net/ 我的订阅-收费课 购课后如何领取免费赠送的编程大礼包? 购课后,添加助教微信: csdn590,按提示领取大礼包
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页

打赏

xiaosun

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值