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---调度接口与自动化

自动化服务器:实现了IDispatch接口的COM组件。自动化控制程序:通过IDispatch接口同自动化服务器进行通信的COM客户。IDispatch通过COM接口提供的任何服务都可以通过IDisp...

COM组件开发(二)——COM应用模型及COM库

C/S模型         COM对象与客户程序之间是基于C/S(客户端/服务器)的模型在运行的,COM服务器是组件对象的容器,由组件对象向COM客户提供服务,所以COM的应用模型继承了C/S模型的优...

COM组件设计与应用(一)——起源及复合文件

本文摘自:http://blog.vckbase.com/teacheryang/archive/2005/06/27/8883.html 一、前言   公元一九九五年某个夜黑风高的晚上,我的...

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

聚合 聚合的情况下,外部组件直接把内部组件的接口指针返回给客户,因此无法对接口的实现进行修改 示意图如下 聚合的实现 客户向外部组件请求接口IY,外部组件只是向内部组件查询此接...

《COM技术内幕》第1-6章笔记

《COM技术内幕》第1-6章笔记

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

第6章 在前五章,作者将细节问题隐藏起来。本章主要将讨论COM的细节问题--HRESULT,GUID,注册表,最后介绍了COM库中一些函数。 HRESULT: 是QueryInter...

纠错《COM技术内幕》之ProgID

最近在看《COM技术内幕》,看到第六章时发现该章节在解释ProgID时有点错误,特此记录一下,也给正在学习COM的小伙伴们一个提示。 因为我发现该BUG存在于一些很多大型软件的COM组件中。(开发者估...
  • aqtata
  • aqtata
  • 2014年07月04日 21:49
  • 2241

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

第二章 本章讨论了接口在COM中的作用,以及COM规范对接口的内存结构要求。 DLL的接口是它所输出的那些函数,C++类的接口则是该类的成员函数集,COM接口是一组由组件实现并提供给客户使...

COM技术内幕学习笔记---第八章---组件复用:包容和聚合

COM 不支持实现继承的原因在于这种继承方式将 使得一个对象的实现同另外一个对象的实现紧紧地关联起来。 在这种情况下,当基类的实现被修改之后,派生类将无法正常运行而必须被修改。对于一个中等规模的C+...

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

第三章 本章讨论了客户如何向组件询问它所支持的接口,组件如何回答,以及这种请求应答方式的结果。 客户同组件交互都是通过接口完成的。在客户程序查询组件的其他接口时,也是通过接口完成的,因...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM技术内幕--调试接口与自动化
举报原因:
原因补充:

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