2

我找到了一个执行 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;
}

奇怪的 Line 是方法中的 Line 2。Result 结果 = .... _nativePointer 声明如下:

protected unsafe void* _nativePointer;

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

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

4

1 回答 1

1

来自MSDN - 指针类型(C# 编程指南

*执行指针间接。

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

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

pointer->field 或者 (*pointer).field

注意:(也来自MSDN - 指针类型(C# 编程指南):

您不能将间接运算符应用于 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*'s。

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

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

于 2012-06-20T18:44:07.340 回答