我需要通过一个IntPtr到IStream.Read,并且IntPtr的应指向ULONG变量。我如何得到这个IntPtr的指向我的ULONG变量?

有帮助吗?

解决方案

,最好的方法是改变的IStream定义:

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

然后可以写

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

其他提示

我相信你,如果你想避免不安全的代码使用的GCHandle方法。我不知道这是如何工作与装箱的值类型。

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

在某一点后,你将需要调用Marshal.FreeHGlobal的“PTR”值。

var pointer = new IntPtr(&myVariable);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top