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;
}

奇妙な行は、メソッドの行 2 です。Result 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 ポインターを他のポインター型に変換したり、その逆を行ったりすることができます。

混乱を引き起こしている主な行が 1 つあるようです。私はそれを分解しようとします:

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

最初の部分はかなり自明です。Result result = (Result)...

次に**(((IntPtr*) base._nativePointer))、 base._nativePointer を IntPtr* にキャストし、それを 2 回参照解除しているように見えます。つまり、別のポインターを指す必要があります。指すポインターを取得するために一度逆参照し、次にそのポインターの値を取得するためにもう一度逆参照します。これを と呼びますX

次の部分は[(int) (((IntPtr) 3) * sizeof(void*))]です。void ポインターのサイズを取得し、それを 3 で乗算します (最初に IntPtr としてキャストされている理由を聞かないでください)。次に、その値を使用して X にインデックスを付けます。最初から void* が 3 つある X のインデックスを見つけます。

最後の部分は(base._nativePointer, (IntPtr) &native). これは、X[3 void's](上記の疑似コード) の値が関数であり、それを呼び出していることを示しています。

全体として、コード行は、 が指すポインターに格納されている (またはその近く?) 関数を呼び出しますbase._nativePointer。この関数にはパラメータbase._nativePointerand &native(IntPtr にキャスト) が渡され、 a が返されますResult

于 2012-06-20T18:44:07.340 に答える