2009-03-27 36 views
0

IntPtrをIStream.Readに渡す必要があり、IntPtrがulong変数を指す必要があります。私のulong変数を指すこのIntPtrを取得するにはどうすればよいですか?C#のulong変数へのIntPtrの取得

+0

を書くことができます

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

.NETののIntPtrであるため、彼はULONGを望んでいますx64システムで64ビット。 – Powerlord

+0

IStream.ReadにはulongにIntPtrが必要なので、ulongが必要です。 – Ries

答えて

2

最良の方法は、IStreamの定義を変更することです:そして、あなたはこの質問に答える人々に注意点として

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

私はこれが私の最高の選択肢であると認識していました。結局のところ、IStreamは単なるインタフェースです。自分のインターフェースを作成してみませんか – Ries

0
var pointer = new IntPtr(&myVariable); 
+0

これはポインタを取得しますが、GCに固定されたままにするように要求していないので、myVariableが移動され、ポインタがあなたに属しなくなります。 – Samuel

2

安全でないコードを避けたい場合は、GCHandleメソッドを使用する必要があります。私はボックス化された値の型でこれがどのように機能するかについてはわかりません。

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

これは近づいた。興味深いことに、私はMarshal.WriteInt64に戻って値を私のulong変数に戻す必要がありました(おそらく十分にスマートではなかったデバッグされました) – Ries

1

安全でないコードを使用できない場合は、次を試してください。

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

後で、「ptr」値でMarshal.FreeHGlobalを呼び出す必要があります。

関連する問題