سؤال

وأحتاج لتمرير 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