Discuz!NT
欢迎 游客 , 注册 | 登录 | 会员 | 界面 | 简洁版本 | 在线 | 帮助
商都网教育宝典宝库

发表新主题 回复该主题
本主题被查看799次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: Unmanaged Code和Managed Code混合编程中使用COM接口指针的一种方法
张小峰
超级版主
UID: 14
来自:
精华: 4
积分: 313
帖子: 285
注册: 2007-8-23 10:27:00
状态: 离线
威望: 8.00
金钱: 75.55 元
只看楼主 2007-09-07 11:35
Unmanaged Code和Managed Code混合编程中使用COM接口指针的一种方法
大家先看一段代码。

private unsafe void Initialize(IDispatch* pObject)
{
    this.m_pdispObject = pObject;
    **(((int*) pObject))[4](pObject);
    this.m_eventIID = Guid.Empty;
    this.m_dwEventCookie = 0;

   
}

  这是使用C#语言写的某Class的一个成员函数内的部分代码。

  其中 **(((int*) pObject))[4](pObject); 这一行是关键的一笔,初看起来,很像是早期使用C语言写OLE程序时的情景,至少有异曲同工的感觉。

  要理解这一行代码的意思,需要看一下在上下文中IDispatch的定义:


[StructLayout(LayoutKind.Sequential, Size=4), MiscellaneousBits(0x41), DebugInfoInPDB, NativeCppClass, CLSCompliant(false)]
public static class IDispatch : ValueType
{
}

  这又是在C#语言中定义对应于C++ Class的Object的VPtr的一种非常妙的方法。

  至此,就可以完全清楚前面那段代码的意思了:

  **(((int*) pObject))[4](pObject);

  这一行相当于C++中的

  pObject->AddRef();

  至于"[]"操作符中,为什么是4代表了AddRef调用,留给读者自己去理解,结合COM规范中接口的本质、C++ Class的V-Table的布局,不难得到答案。

  Unmanaged Code和Managed Code混合编程中,这种使用COM接口指针的方法,虽稍显晦涩,但在不方便使用C++/CLI而必须使用C#的地方,还是很方便的,而且整体来看,这种方式也还是相当优雅的。
#1  
发表新主题 回复该主题
本主题被查看799次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2008-10-08 14:34:25

版权所有 商都网教育宝典
         Powered by Discuz!NT 1.0.6666    Copyright © 2001-2008 Comsenz Inc.
Processed in 0 seconds