Bagikan melalui


Marshal.PtrToStructure Metode

Definisi

Marshal data dari blok memori yang tidak dikelola ke objek terkelola.

Overload

PtrToStructure(IntPtr, Object)
Kedaluwarsa.

Marshal data dari blok memori yang tidak dikelola ke objek terkelola.

PtrToStructure(IntPtr, Type)
Kedaluwarsa.

Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan.

PtrToStructure<T>(IntPtr)

Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan oleh parameter jenis generik.

PtrToStructure<T>(IntPtr, T)

Marshals data dari blok memori yang tidak dikelola ke objek terkelola dari jenis yang ditentukan.

PtrToStructure(IntPtr, Object)

Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs

Perhatian

PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512

Marshal data dari blok memori yang tidak dikelola ke objek terkelola.

public:
 static void PtrToStructure(IntPtr ptr, System::Object ^ structure);
[System.Obsolete("PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512")]
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
public static void PtrToStructure (IntPtr ptr, object structure);
[System.Security.SecurityCritical]
public static void PtrToStructure (IntPtr ptr, object structure);
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static void PtrToStructure (IntPtr ptr, object structure);
[<System.Obsolete("PtrToStructure(IntPtr, Object) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296512")>]
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * obj -> unit
static member PtrToStructure : nativeint * obj -> unit
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * obj -> unit
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * obj -> unit
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * obj -> unit
Public Shared Sub PtrToStructure (ptr As IntPtr, structure As Object)

Parameter

ptr
IntPtr

nativeint

Penunjuk ke blok memori yang tidak dikelola.

structure
Object

Objek tempat data akan disalin. Ini harus berupa instans kelas yang diformat.

Atribut

Pengecualian

Tata letak struktur tidak berurutan atau eksplisit.

-atau-

Struktur adalah jenis nilai dalam kotak.

Keterangan

PtrToStructure sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai System.IntPtr nilai. Anda tidak dapat menggunakan metode kelebihan beban ini dengan jenis nilai. ptr Jika parameter sama dengan IntPtr.Zero, null akan dikembalikan.

Berlaku untuk

PtrToStructure(IntPtr, Type)

Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs

Perhatian

PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513

Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan.

public:
 static System::Object ^ PtrToStructure(IntPtr ptr, Type ^ structureType);
[System.Obsolete("PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513")]
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
public static object? PtrToStructure (IntPtr ptr, Type structureType);
[System.Security.SecurityCritical]
public static object PtrToStructure (IntPtr ptr, Type structureType);
public static object PtrToStructure (IntPtr ptr, Type structureType);
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(true)]
public static object PtrToStructure (IntPtr ptr, Type structureType);
[<System.Obsolete("PtrToStructure(IntPtr, Type) may be unavailable in future releases. Instead, use PtrToStructure<T>(IntPtr). For more info, go to http://go.microsoft.com/fwlink/?LinkID=296513")>]
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * Type -> obj
static member PtrToStructure : nativeint * Type -> obj
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * Type -> obj
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * Type -> obj
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(true)>]
static member PtrToStructure : nativeint * Type -> obj
Public Shared Function PtrToStructure (ptr As IntPtr, structureType As Type) As Object

Parameter

ptr
IntPtr

nativeint

Penunjuk ke blok memori yang tidak dikelola.

structureType
Type

Jenis objek yang akan dibuat. Objek ini harus mewakili kelas atau struktur yang diformat.

Mengembalikan

Objek terkelola yang berisi data yang ditujukkan oleh ptr parameter .

Atribut

Pengecualian

Tata structureType letak parameter tidak berurutan atau eksplisit.

-atau-

Parameter structureType adalah definisi jenis generik.

structureTypeadalah null.

Kelas yang ditentukan oleh structureType tidak memiliki konstruktor tanpa parameter yang dapat diakses.

Contoh

Contoh berikut membuat struktur terkelola, mentransfernya ke memori yang tidak dikelola, lalu mentransfernya kembali ke memori terkelola PtrToStructure menggunakan metode .

using System;
using System.Runtime.InteropServices;

public struct Point
{
    public int x;
    public int y;
}

class Example
{

    static void Main()
    {

        // Create a point struct.
        Point p;
        p.x = 1;
        p.y = 1;

        Console.WriteLine("The value of first point is " + p.x + " and " + p.y + ".");

        // Initialize unmanged memory to hold the struct.
        IntPtr pnt = Marshal.AllocHGlobal(Marshal.SizeOf(p));

        try
        {

            // Copy the struct to unmanaged memory.
            Marshal.StructureToPtr(p, pnt, false);

            // Create another point.
            Point anotherP;

            // Set this Point to the value of the
            // Point in unmanaged memory.
            anotherP = (Point)Marshal.PtrToStructure(pnt, typeof(Point));

            Console.WriteLine("The value of new point is " + anotherP.x + " and " + anotherP.y + ".");
        }
        finally
        {
            // Free the unmanaged memory.
            Marshal.FreeHGlobal(pnt);
        }
    }
}
Imports System.Runtime.InteropServices



Public Structure Point
    Public x As Integer
    Public y As Integer
End Structure


Module Example


    Sub Main()

        ' Create a point struct.
        Dim p As Point
        p.x = 1
        p.y = 1

        Console.WriteLine("The value of first point is " + p.x.ToString + " and " + p.y.ToString + ".")

        ' Initialize unmanged memory to hold the struct.
        Dim pnt As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(p))

        Try

            ' Copy the struct to unmanaged memory.
            Marshal.StructureToPtr(p, pnt, False)

            ' Create another point.
            Dim anotherP As Point

            ' Set this Point to the value of the 
            ' Point in unmanaged memory. 
            anotherP = CType(Marshal.PtrToStructure(pnt, GetType(Point)), Point)

            Console.WriteLine("The value of new point is " + anotherP.x.ToString + " and " + anotherP.y.ToString + ".")

        Finally
            ' Free the unmanaged memory.
            Marshal.FreeHGlobal(pnt)
        End Try

    End Sub
End Module

Contoh berikut menunjukkan cara melakukan marshal blok memori yang tidak dikelola ke struktur terkelola menggunakan PtrToStructure metode .

Penting

Kode ini mengasumsikan kompilasi 32-bit. Sebelum menggunakan pengkompilasi 64-bit, ganti IntPtr.ToInt32 dengan IntPtr.ToInt64.

[StructLayout(LayoutKind::Sequential)]
ref class INNER
{
public:
    [MarshalAs(UnmanagedType::ByValTStr,SizeConst=10)]
    String^ field;

    INNER()
    {
        field = "Test";
    }
};

[StructLayout(LayoutKind::Sequential)]
value struct OUTER
{
public:
    [MarshalAs(UnmanagedType::ByValTStr,SizeConst=10)]
    String^ field;

    [MarshalAs(UnmanagedType::ByValArray,SizeConst=100)]
    array<Byte>^ inner;
};

[DllImport("SomeTestDLL.dll")]
static void CallTest(OUTER^ outerStructurePointer);

void static Work()
{
    OUTER outerStructure;
    array<INNER^>^ innerArray = gcnew array<INNER^>(10);
    INNER^ innerStructure = gcnew INNER;
    int structSize = Marshal::SizeOf(innerStructure);
    int size = innerArray->Length * structSize;
    outerStructure.inner = gcnew array<Byte>(size);

    try
    {
        CallTest(outerStructure);
    }
    catch (SystemException^ ex) 
    {
        Console::WriteLine(ex->Message);
    }

    IntPtr buffer = Marshal::AllocCoTaskMem(structSize * 10);
    Marshal::Copy(outerStructure.inner, 0, buffer, structSize * 10);
    int currentOffset = 0;
    for (int i = 0; i < 10; i++)
    {
        innerArray[i] = safe_cast<INNER^>(Marshal::PtrToStructure(
            IntPtr(buffer.ToInt32() + currentOffset),
            INNER::typeid));
        currentOffset += structSize;
    }
    Console::WriteLine(outerStructure.field);
    Marshal::FreeCoTaskMem(buffer);
}

        [StructLayout(LayoutKind.Sequential)]

        public class  INNER

        {

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

            public string field1 = "Test";
        }	

        [StructLayout(LayoutKind.Sequential)]

        public struct OUTER

        {

            [MarshalAs(UnmanagedType.ByValTStr, SizeConst =  10)]

            public string field1;

            [MarshalAs(UnmanagedType.ByValArray, SizeConst =  100)]

            public byte[] inner;
        }
        [DllImport(@"SomeTestDLL.dll")]

        public static extern void CallTest( ref OUTER po);
        static void Main(string[] args)

        {

            OUTER ed = new OUTER();

            INNER[] inn=new INNER[10];

            INNER test = new INNER();

            int iStructSize = Marshal.SizeOf(test);
            int sz =inn.Length * iStructSize;

            ed.inner = new byte[sz];
            try

            {

                CallTest( ref ed);
            }

            catch(Exception e)

            {

                Console.WriteLine(e.Message);
            }

            IntPtr buffer = Marshal.AllocCoTaskMem(iStructSize*10);

            Marshal.Copy(ed.inner,0,buffer,iStructSize*10);
            int iCurOffset = 0;

            for(int i=0;i<10;i++)

            {
                inn[i] = (INNER)Marshal.PtrToStructure(new
IntPtr(buffer.ToInt32()+iCurOffset),typeof(INNER) );

                iCurOffset += iStructSize;
            }

            Console.WriteLine(ed.field1);

            Marshal.FreeCoTaskMem(buffer);
        }

Keterangan

PtrToStructure sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai System.IntPtr nilai. Anda dapat meneruskan jenis nilai ke metode kelebihan beban ini. Dalam hal ini, objek yang dikembalikan adalah instans kotak. ptr Jika parameter sama dengan IntPtr.Zero, null akan dikembalikan.

Lihat juga

Berlaku untuk

PtrToStructure<T>(IntPtr)

Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs

Marshals data dari blok memori yang tidak dikelola ke objek terkelola yang baru dialokasikan dari jenis yang ditentukan oleh parameter jenis generik.

public:
generic <typename T>
 static T PtrToStructure(IntPtr ptr);
[System.Security.SecurityCritical]
public static T PtrToStructure<T> (IntPtr ptr);
public static T? PtrToStructure<T> (IntPtr ptr);
public static T PtrToStructure<T> (IntPtr ptr);
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint -> 'T
static member PtrToStructure : nativeint -> 'T
Public Shared Function PtrToStructure(Of T) (ptr As IntPtr) As T

Jenis parameter

T

Jenis objek tempat data akan disalin. Ini harus merupakan kelas atau struktur yang diformat.

Parameter

ptr
IntPtr

nativeint

Penunjuk ke blok memori yang tidak dikelola.

Mengembalikan

T

Objek terkelola yang berisi data yang dituju ptr parameter.

Atribut

Pengecualian

Tata letak T tidak berurutan atau eksplisit.

Kelas yang ditentukan oleh T tidak memiliki konstruktor tanpa parameter yang dapat diakses.

Keterangan

PtrToStructure<T>(IntPtr) sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai System.IntPtr nilai. Anda dapat meneruskan jenis nilai ke metode ini kelebihan beban. ptr Jika parameter sama IntPtr.Zero dan T merupakan jenis referensi, null dikembalikan. Jika ptr sama dengan IntPtr.Zero dan T merupakan jenis nilai, akan NullReferenceException dilemparkan.

Berlaku untuk

PtrToStructure<T>(IntPtr, T)

Sumber:
Marshal.cs
Sumber:
Marshal.cs
Sumber:
Marshal.cs

Marshals data dari blok memori yang tidak dikelola ke objek terkelola dari jenis yang ditentukan.

public:
generic <typename T>
 static void PtrToStructure(IntPtr ptr, T structure);
[System.Security.SecurityCritical]
public static void PtrToStructure<T> (IntPtr ptr, T structure);
public static void PtrToStructure<T> (IntPtr ptr, T structure);
[<System.Security.SecurityCritical>]
static member PtrToStructure : nativeint * 'T -> unit
static member PtrToStructure : nativeint * 'T -> unit
Public Shared Sub PtrToStructure(Of T) (ptr As IntPtr, structure As T)

Jenis parameter

T

Jenis structure. Ini harus merupakan kelas yang diformat.

Parameter

ptr
IntPtr

nativeint

Penunjuk ke blok memori yang tidak dikelola.

structure
T

Objek tempat data akan disalin.

Atribut

Pengecualian

Tata letak struktur tidak berurutan atau eksplisit.

Keterangan

PtrToStructure<T>(IntPtr, T) sering diperlukan dalam interop COM dan pemanggilan platform ketika parameter struktur direpresentasikan sebagai IntPtr nilai. Anda tidak dapat menggunakan metode ini yang kelebihan beban dengan tipe nilai. ptr Jika parameter sama IntPtr.Zero dan T merupakan jenis referensi, null dikembalikan. Jika ptr sama dengan IntPtr.Zero dan T merupakan jenis nilai, akan NullReferenceException dilemparkan.

Berlaku untuk