質問

私はIStream.ReadへのIntPtrを渡す必要がある、とのIntPtrはULONG変数を指している必要があります。どのように私は私のULONG変数を指し、こののIntPtrを得るのですか?

役に立ちましたか?

解決

最良の方法は、IStreamの定義を変更することがあります:

void Read([Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] byte[] pv,
          int cb, /*IntPtr*/ ref int pcbRead);

そして、あなたが書くことができます。

int pcbRead = 0;
Read(..., ref pcbRead);

他のヒント

私はあなたが危険なコードを避けたい場合はGCHandleメソッドを使用する必要が信じています。私は、これはboxed値型でどのように機能するかについて確認していない。

var handle = GCHandle.Alloc(myVar, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject()

あなたが危険なコードを使用することができない場合は、以下を試してみてください。

var myValue = GetTheValue();
var ptr = Marshal.AllocHGLobal(Marshal.SizeOf(typeof(ulong));
Marshal.StructureToPointer(ptr, myValue, false);

後にいくつかの時点で、あなたは「PTR」値にMarshal.FreeHGlobalを呼び出す必要があります。

var pointer = new IntPtr(&myVariable);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top