15-08-17, 02:06 PM
(آخر تعديل لهذه المشاركة : 15-08-17, 03:11 PM {2} بواسطة silverlight.)
هذا الموضوع الهدف منه كيفية تحويل Delegate الي IntPtr و العكس
هذا الموضوع ليس للمبتدئين
توضيح سريع :
Deleagte :
وكما هو معلوم للجميع عبارة عن مؤشر ما
هذا المؤشر ربما يشير الي دالة Function او يشير الي روتين Sub داخل اي كلاس او داخل اي فئة
عملية التحويل من Deleagte الي IntPtr و العكس
ممكن أن تتم باستخدام بعض الدوال الموجودة في المارشال كلاس
و الروابط التالية توضح اسماء تلك الدوال
التحويل من Delegate الي IntPtr
الرابط
التحويل من IntPtr الي Delegate
الرابط
المثال التالي يوضح كيفية استخدام الدوال الموجودة في المارشال كلاس
المثال :
تحويل Delegate Function الي IntPtr و العكس
أولا لنوضح كيف تكتب Delegate
مثلا لكي تكتب Delegate يشير الي دالة يجب أن يكون Signature واحد و المقصود بكلمة أن يكون Signature واحد هو أن تكون المدخلات و المخرجات لهذه الدالة هي نفسها التي يجب استخدامها في كتابة Delegate
ولتوضيح الأمر بشكل مبسط لناخد الدالة IO.File.Exists
الرابط
هذه الدالة Syntax الخاص بها كالأتي
Public Shared Function Exists (path As String) As Boolean
مثلا لكي تستخدم الدالة فأنت تحتاج أن تمرر لها String يشير الي مسار اي ملف و هذا ما يطلق عليه المدخلات ثم تحصل من الدالة علي نتيجة عبارة عن Boolean و هذا ما يطلق عليه المخرجات
ولكي تكتب Deleagte يشير الي هذا الدالة فيجب أن تكتبه كالأتي
الأن لنقوم بتحويل Deleggte الي IntPtr
والخطوات التالية توضح ذلك
1- نقوم بتعريف متغير يعبر عن Deleagte
أو يمكن كتابة الكود بشكل مباشر كالتالي
2- نقوم بتحويل Deleagte الي Intptr
3- الكود التالي من أجل التوضيح فقط لكي نتأكد أن عملية التحويل قد تمت
الكود كاملا:
و للتحويل من IntPtr الي Deleagte مرة أخري
فقط نحتاج أن نعرف Type الخاص بهذا Delegate و قيمة IntPtr الخاصة به
و نستخدم دوال المارشال كلاس للتحويل
أتمني يكون الموضوع هذا مفيدا للبعض منكم
هذا الموضوع ليس للمبتدئين
توضيح سريع :
Deleagte :
وكما هو معلوم للجميع عبارة عن مؤشر ما
هذا المؤشر ربما يشير الي دالة Function او يشير الي روتين Sub داخل اي كلاس او داخل اي فئة
عملية التحويل من Deleagte الي IntPtr و العكس
ممكن أن تتم باستخدام بعض الدوال الموجودة في المارشال كلاس
و الروابط التالية توضح اسماء تلك الدوال
التحويل من Delegate الي IntPtr
الرابط
التحويل من IntPtr الي Delegate
الرابط
المثال التالي يوضح كيفية استخدام الدوال الموجودة في المارشال كلاس
المثال :
تحويل Delegate Function الي IntPtr و العكس
أولا لنوضح كيف تكتب Delegate
مثلا لكي تكتب Delegate يشير الي دالة يجب أن يكون Signature واحد و المقصود بكلمة أن يكون Signature واحد هو أن تكون المدخلات و المخرجات لهذه الدالة هي نفسها التي يجب استخدامها في كتابة Delegate
ولتوضيح الأمر بشكل مبسط لناخد الدالة IO.File.Exists
الرابط
هذه الدالة Syntax الخاص بها كالأتي
Public Shared Function Exists (path As String) As Boolean
مثلا لكي تستخدم الدالة فأنت تحتاج أن تمرر لها String يشير الي مسار اي ملف و هذا ما يطلق عليه المدخلات ثم تحصل من الدالة علي نتيجة عبارة عن Boolean و هذا ما يطلق عليه المخرجات
ولكي تكتب Deleagte يشير الي هذا الدالة فيجب أن تكتبه كالأتي
PHP كود :
Public Delegate Function IsFielExists(FilePath As String) As Boolean
الأن لنقوم بتحويل Deleggte الي IntPtr
والخطوات التالية توضح ذلك
1- نقوم بتعريف متغير يعبر عن Deleagte
PHP كود :
Dim delegateParams As IsFielExists = New IsFielExists(AddressOf Me.FileExists)
أو يمكن كتابة الكود بشكل مباشر كالتالي
PHP كود :
Dim delegateParams As IsFielExists = New IsFielExists(AddressOf IO.File.Exists)
2- نقوم بتحويل Deleagte الي Intptr
PHP كود :
Dim ptr As IntPtr = IntPtr.Zero
If delegateParams IsNot Nothing Then
ptr = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(delegateParams)
End If
3- الكود التالي من أجل التوضيح فقط لكي نتأكد أن عملية التحويل قد تمت
PHP كود :
If ptr <> IntPtr.Zero Then
Me.Text = ptr.ToString
End If
الكود كاملا:
PHP كود :
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim delegateParams As IsFielExists = New IsFielExists(AddressOf Me.FileExists)
Dim ptr As IntPtr = IntPtr.Zero
If delegateParams IsNot Nothing Then
ptr = System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(delegateParams)
End If
If ptr <> IntPtr.Zero Then
Me.Text = ptr.ToString
End If
End Sub
Private Function FileExists(filePath As String) As Boolean
Return IO.File.Exists(filePath)
End Function
Public Delegate Function IsFielExists(FilePath As String) As Boolean
End Class
و للتحويل من IntPtr الي Deleagte مرة أخري
فقط نحتاج أن نعرف Type الخاص بهذا Delegate و قيمة IntPtr الخاصة به
و نستخدم دوال المارشال كلاس للتحويل
PHP كود :
Dim t As Type = delegateParams.GetType
If ptr <> IntPtr.Zero Then
Dim callBak As IsFielExists = System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(ptr, t)
Me.Text = callBak("any file name")
End If
أتمني يكون الموضوع هذا مفيدا للبعض منكم
Retired