الحصول على IntPtr إلى متغير ULONG في C #
سؤال
وأحتاج لتمرير 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);
لا تنتمي إلى StackOverflow