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

来源:互联网 发布:网游网络加速器哪个好 编辑:程序博客网 时间:2024/05/01 18:52
同每一个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;
1 0
原创粉丝点击