COM技术内幕--调试接口与自动化

原创 2016年12月20日 11:09:55
同每一个EXE都有其自己的进程不同,DLL将被映射到链接它们的EXE文件的进程空间中。由于这个原因,DLL也被称作是进程服务器,而EXE则被称作是进程外服务器。
不同进程空间中的相同的内存地址将指向不同的物理内存单元
/////////////

对于跨越进程边界的接口,我们需要考虑如下一些条件:
1)一个进程需要能够调用另外一个进程中的函数。
2)一个进程需要能够将数据传递给另外一个进程
3)客户无需关心它所访问的服务器是进程内服务器不是进程外服务器。
自动化不是独立于COM的,而是建立在COM基础上的。
一个自动化服务器实际上就是一个实现了IDispatch接口COM组件。
一个自动化控制器则是一个通过IDispatch接口同自动化服务器进行通信的COM客户。
自动化控制器不会直接调用自动化服务器实现的那些函数,而是通过IDispatch接口中的成员函数实现对服务器的间接调用。
IDispatch接口:
1)调度接口
IDispatch::Invoke人实现与vtbl相似处:它们都可以定义接口。
IDispatch::Invoke的一个实现所实现的函数集被称作是一个调度接口。
而COM接口是一个指向一个函数指针数组的指针,此数组的前三个元素分别是QueryInterface、AddRef以及Release。
接口是一组函数和变量的集合,程序的两个不同部分可通过它进行通信。
IDispatch::Invoke的实现也是由一组函数构成的,自动化控制器和自动化服务器可以通过它进行交互。
调度接口图示:
////////////

使用一个COM接口来实现IDispatch::Invoke
/////////////

2)双重接口
双重接口是一种从IDispatch继承的COM接口。此接口的成员函数可以通过Invoke和vtbl这两种方式访问
/////////////

类型库加入到Windows注册表中的信息
/////////////

IDispatch接口的实现:
异常的引发:
1)在组件中实现ISupportErrorInfo接口。此接口只有一个成员函数:
virtual HRESULT __stdcall InterfaceSupportsErrorInfo(const IID&iid)
{
RETURN (iid==IID_IX)?S_OK:S_FALSE;
}
2)在IDispatch::Invoke的实现中,于ITypeInfo::Invoke调用之前调用SetErrorInfo(0,NULL).
3)当发生异常时,调用CreateErrorInfo以获取一个ICreateErrorInfo接口指针。
4)使用ICreateErrorInfo填充关于错误的信息。
5)最后调用SetErrorInfo,并将ICreateErrorInfo接口指针作为第二个参数传给它。第一个参数是保留的,恒为0.
一个引起异常的例子:
ICreateErrorInfo* pICreateErr;
HRESULT hr = ::CreateErrorInfo(&pICreateErr);
IF (FAILOVER(hr))
{
RETURN E_FAIL;
}
pICreateErr->SetSource(L"InsideCOM.Chap11.Cmpnt");
pICreateErr->SetDescription(L"This is a fake error generated by the component");
IErrorInfo* pIErrorInfo = NULL;
hr = pICreateErr->QueryInterface(IID_IErrorInfo,(void**)&pIErrorInfo);
IF (SUCCEEDED(hr))
{
::SetErrorInfo(0,pIErrorInfo);
pIErrorInfo->Release();
}
pICreateErr->Release();
RETURN E_FAIL;

COM技术内幕的源码笔记2.2.2

COM技术内幕的源码笔记2.2.2
  • q357010621
  • q357010621
  • 2017年05月30日 13:14
  • 350

COM 技术内幕学习之八(包容和聚合)

一、实现继承1、COM支持的是接口继承,它继承的是抽象基类的接口COM为什么不用实现继承?(基类组件的改动引起派生类组件的改动)2、一般的继承是派生类继承基类的实现3、用组件包容来模拟实现继承在C++...
  • InsideKernel
  • InsideKernel
  • 2008年03月11日 15:25
  • 1276

VC技术内幕总结

VC技术内幕总结对技术内幕的学习,主要是集中在前三部分和后面COM,ODBC的学习,感觉这本书还是写得不错的,分析的也比较清晰,例子不错,有很多细节的小技巧值得我们推敲,结合深入浅出MFC学习,相信会...
  • pasu2005
  • pasu2005
  • 2006年10月15日 11:09
  • 578

15.COM 自动化原理

简介COM自动化好处、原理和IDispatch接口实现细节。
  • wenzhou1219
  • wenzhou1219
  • 2016年07月30日 17:47
  • 1213

COM技术内幕(笔记)

COM——到底是什么?——COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义——COM术语以及这些术语的含义。使用和处理COM对象——如何创建、使用和销毁COM对象。基本接口——描述IUn...
  • cometwo
  • cometwo
  • 2015年04月25日 16:37
  • 2605

COM技术内幕--接口

对组件的需求: 第一:组件必须动态连接 第二:它们必须隐藏其内部实现细节。 实际上COM是使用了DLL来给组件提供动态链接的能力。 带来的好处: 1.提供了一个所有组件都应遵守的标准 2.允许...
  • zang141588761
  • zang141588761
  • 2016年12月14日 16:28
  • 165

COM原理与实现之二: 聚合

COM原理与实现之二: 聚合C++没有同聚合等价的特性。聚合实际上是继承性的一种动态形式。而C++的继承总是静态的,是实现继承。COM是接口继承,通过聚合接口,可以做成动态配置。研究COM,主要是利用...
  • cheungmine
  • cheungmine
  • 2016年06月14日 00:05
  • 5937

com技术内幕--读书笔记(7)

第7章 类厂 相信有了前六章的知识积累,学些以后的章节将会很顺利。本章实现了一个真正的COM组件,并通过client客户端来使用这个组件。学完这章,对COM组件的最基本的东西就已经学完了,可以实...
  • simeone18
  • simeone18
  • 2011年12月15日 22:53
  • 3093

COM---调度接口与自动化

自动化服务器:实现了IDispatch接口的COM组件。自动化控制程序:通过IDispatch接口同自动化服务器进行通信的COM客户。IDispatch通过COM接口提供的任何服务都可以通过IDisp...
  • u012319493
  • u012319493
  • 2017年02月19日 14:55
  • 1142

自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)

二次开发接口(API)与插件(Addin)许式伟 (版权声明)2007-4-20在前文,我们已经解释了: 自动化(Automation)基础概念:COM组件(Component)与接口(Inte...
  • xushiweizh
  • xushiweizh
  • 2007年04月20日 02:10
  • 4933
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM技术内幕--调试接口与自动化
举报原因:
原因补充:

(最多只允许输入30个字)