تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
Convert Delegate to IntPtr & Viceversa
#1
هذا الموضوع الهدف منه كيفية تحويل 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 ObjectAs EventArgsHandles 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(ptrt)
 
           Me.Text callBak("any file name")
 
       End If 

أتمني يكون الموضوع هذا مفيدا للبعض منكم
Retired
الرد }}}
تم الشكر بواسطة: أبو نوره , أبو نوره , ابو ليلى


الردود في هذا الموضوع
Convert Delegate to IntPtr & Viceversa - بواسطة silverlight - 15-08-17, 02:06 PM
RE: Convert Delegate to IntPtr & Viceversa - بواسطة silverlight - 15-08-17, 04:54 PM

المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  Code Snippet: Convert From Ulong To Byte Array & Vice Versa silverlight 0 1,854 08-05-18, 05:15 PM
آخر رد: silverlight
  Delegate Function silverlight 6 3,224 30-10-17, 04:27 PM
آخر رد: alsouf
  Convert structure to byteArray & viceversa silverlight 0 1,855 24-09-17, 01:51 AM
آخر رد: silverlight
  Convert Bitmap To ByteArray & ViceVersa silverlight 0 2,356 22-09-17, 03:13 PM
آخر رد: silverlight
  كيفية قراءة ملف باستخدام IntPtr الخاص بالملف silverlight 3 3,969 24-12-16, 03:13 AM
آخر رد: silverlight
  Convert Bitmap To Integer & Viceversa silverlight 5 3,883 28-05-16, 02:17 PM
آخر رد: CLARO
  [كود] Concatenate List(Of T) with Func Delegate silverlight 0 2,000 28-01-16, 07:24 PM
آخر رد: silverlight
  [VB.NET] عمل برنامج تحويل الفيديو video convert alking-0999 0 3,017 09-07-15, 12:50 PM
آخر رد: alking-0999

التنقل السريع :


يقوم بقرائة الموضوع: