C#使用指针调用奇怪的方法?
我找到了一个执行directx com导入的代码。但是我不理解它,它在我的代码中也不起作用 这是一个代码:C#使用指针调用奇怪的方法?,c#,pointers,com,C#,Pointers,Com,我找到了一个执行directx com导入的代码。但是我不理解它,它在我的代码中也不起作用 这是一个代码: internal unsafe Result GetCapabilities(out BufferCapabilities dSBufferCapsRef) { BufferCapabilities.__Native native = BufferCapabilities.__NewNative(); Result result = (Result) **(((IntPtr
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;
那么我的答案是,如何才能调用指针所指的共产国际成员。我如何称呼它:(base.\u nativePointer,(IntPtr)&native)。
它是指针nativePointer指向的接口的成员
我知道我有点困惑,但我希望你能理解我的问题。来自:
*
执行指针间接寻址
->
通过指针访问结构的成员
您将按如下方式使用它们:
指针->字段
或
(*指针).field
注意:(也来自):
不能将间接运算符应用于void*类型的指针。
但是,可以使用强制转换将空指针转换为任何其他类型
指针类型,反之亦然
看起来有一条主线引起了混乱。我试着把它分解一下:
Result result = (Result) **(((IntPtr*) base._nativePointer))[(int) (((IntPtr) 3) * sizeof(void*))](base._nativePointer, (IntPtr) &native);
第一部分是不言自明的:Result=(Result).
然后我们有**((IntPtr*)base.\u nativePointer))
,它似乎是铸造base.\u nativePointer指向一个IntPtr*,然后取消引用它两次。这意味着它必须指向另一个指针。我们取消引用一次以获得指向指针,然后再次获得该指针的值。我们称之为X
下一部分是[(int)((IntPtr)3)*sizeof(void*)]
。它获取一个空指针的大小,然后将其乘以3(不要问我为什么要先将其转换为IntPtr)。然后它使用这个值来索引X。它找到X的索引,从它的开始就是3个void*
最后一部分是(base.\u nativePointer,(IntPtr)&native)
。这告诉我,X[3 void's]
(上面的伪代码)处的值是一个函数,我们正在调用它
总的来说,代码行调用存储在
base.\u nativePointer
指向的指针中(或附近?)的函数。函数被传递给参数base.\u nativePointer
和&native
(转换为IntPtr),并返回结果
,但我发布的代码是如何工作的?因为我不明白的是,代码如何能够在没有membername的情况下访问成员。它由[]中的索引访问,然后用()中的参数调用一个方法。我看到您编辑了答案。谢谢。但是我不能调用这个函数。如何调用该函数?我必须将其转换为委托还是什么?是您编写的GetCapabilities
,还是自动生成的?你想调用什么函数?如果您编写了该函数中的代码,但它不起作用,请尝试将其强制转换为委托。它看起来像是在直接调用COM接口的第四个函数。可能是IDirectSoundBuffer8::GetCaps()。如果您不想维护此代码,请将其扔掉。