C#strange使用指针调用方法?

时间:2012-06-20 18:28:44

标签: c# pointers com

我找到了一个执行directx com导入的代码。但我不理解它,它也不适用于我的代码。

这是代码:

internal unsafe Result GetCapabilities(out BufferCapabilities dSBufferCapsRef)
{
    BufferCapabilities.__Native native = BufferCapabilities.__NewNative();
    Result result = (Result) **(((IntPtr*) base._nativePointer))[(int) (((IntPtr) 3) * sizeof(void*))](base._nativePointer, (IntPtr) &native);
    dSBufferCapsRef = new BufferCapabilities();
    dSBufferCapsRef.__MarshalFrom(ref native);
    result.CheckError();
    return result;
}

奇怪的线是方法中的第二行。结果结果= .... _nativePointer声明如下:

protected unsafe void* _nativePointer;

所以我的答案是如何调用指针所指的cominterface的成员。我该如何调用它:(base._nativePointer,(IntPtr)& native)。 它是指针_nativePointer指向的接口的成员。

我知道我有点困惑,但我希望你理解我的问题。

1 个答案:

答案 0 :(得分:1)

来自MSDN - Pointer Types (C# Programming Guide

  

*执行指针间接。

     

->通过指针访问结构的成员。

您可以按如下方式使用它们:

pointer->field 要么 (*pointer).field

注意:(也来自MSDN - Pointer Types (C# Programming Guide):

  

您不能将间接运算符应用于void *类型的指针。   但是,您可以使用强制转换将void指针转换为任何其他指针   指针类型,反之亦然。

看起来有一条主线引起混乱。我会试着把它分解下来:

Result result = (Result) **(((IntPtr*) base._nativePointer))[(int) (((IntPtr) 3) * sizeof(void*))](base._nativePointer, (IntPtr) &native);

第一部分是相当不言自明的:Result result = (Result)...

然后我们有**(((IntPtr*) base._nativePointer)),它似乎将base._nativePointer转换为IntPtr *,然后将其解除引用两次。这意味着它必须指向另一个指针。我们取消引用一次以获取指向指针,然后再次获取指针的值。我们称之为X

下一部分是[(int) (((IntPtr) 3) * sizeof(void*))]。它得到一个void指针的大小,然后将它乘以3(不要问我为什么它首先被强制转换为IntPtr)。然后它使用该值来索引X.它从它的开头找到X的索引是3 void *。

最后一部分是(base._nativePointer, (IntPtr) &native)。这告诉我X[3 void's]的值(上面的伪代码)是一个函数,我们正在调用它。

总的来说,代码行调用存储在base._nativePointer指向的指针(或附近?)中的函数。该函数传递参数base._nativePointer&native(强制转换为IntPtr),并返回Result