2012-06-20 28 views
2

我發現了一個代碼,可以執行directx com導入。但我不明白它,它也不適用於我的代碼。C#使用指針奇怪的方法調用?

正是這種代碼:

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

看起來它是直接調用COM接口的第4個函數。可能是IDirectSoundBuffer8 :: GetCaps()。你不想維護這段代碼,把它扔掉。 –

回答

1

MSDN - Pointer Types (C# Programming Guide

*執行指針間接。

->通過指針訪問結構體的成員。

pointer->field(*pointer).field

注:

如下你會使用它們(也來自MSDN - Pointer Types (C# Programming Guide):

不能間接運算符適用於類型爲void *的指針。 但是,您可以使用強制轉換將空指針轉換爲任何其他指針類型,反之亦然。

看起來好像有一條主線引起了混淆。我會嘗試OT打破它:

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.它從它的開始找到3的void *的索引。

最後一部分是(base._nativePointer, (IntPtr) &native)。這告訴我,X[3 void's](上面的僞代碼)是一個函數,我們正在調用它。

總的來說,代碼行調用存儲在(或接近?)由base._nativePointer指向的指針的函數。函數傳遞參數base._nativePointer&native(強制轉換爲IntPtr),並返回Result

+0

但是,我發佈的代碼是如何工作的? 因爲我不明白的是該代碼如何在沒有成員名的情況下訪問該成員。它由[]中的索引訪問,然後在() –

+0

中的參數調用一個方法,好吧,我看到你編輯了你的答案。非常感謝。但我不能調用這個函數。我怎樣才能調用該功能? –

+0

我必須將其轉換爲委託或什麼? –