تقييم الموضوع :
  • 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
الرد }}}
تم الشكر بواسطة: أبو نوره , أبو نوره , ابو ليلى
#2
الكود كاملا بعد كتابته علي هيئة دوال

PHP كود :
Public Class Form1

    Private Sub Form1_Load
(sender As ObjectAs EventArgsHandles MyBase.Load

        Dim ptr 
As IntPtr CallBackToIntPtr()
 
       Me.Text IntPtrToCallBack(ptr"any file name")

 
   End Sub

    Private 
Function CallBackToIntPtr() As IntPtr
        Dim delegateParams 
As IsFielExists = New IsFielExists(AddressOf IO.File.Exists)
 
       Dim ptr As IntPtr IntPtr.Zero
        If delegateParams IsNot Nothing Then
            ptr 
System.Runtime.InteropServices.Marshal.GetFunctionPointerForDelegate(delegateParams)
 
       End If
 
       Return ptr
    End 
Function

 
   Private Function IntPtrToCallBack(ptr As IntPtrAs String) As Boolean
        Dim result 
As IsFielExists Nothing
        If ptr 
<> IntPtr.Zero Then
            Dim delegateParams 
As IsFielExists = New IsFielExists(AddressOf IO.File.Exists)
 
           Dim t As Type delegateParams.GetType
            result 
System.Runtime.InteropServices.Marshal.GetDelegateForFunctionPointer(ptrt)
 
       End If
 
       Return result(s)
 
   End Function

 
   Public Delegate Function IsFielExists(FilePath As String) As Boolean

End 
Class 
Retired
الرد }}}
تم الشكر بواسطة: أبو نوره , أبو نوره , ابو ليلى


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

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


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم