Sdílet prostřednictvím


Marshal.PtrToStructure Metoda

Definice

Zařadí data z nespravovaného bloku paměti do spravovaného objektu.

Přetížení

PtrToStructure(IntPtr, Object)
Zastaralé.

Zařadí data z nespravovaného bloku paměti do spravovaného objektu.

PtrToStructure(IntPtr, Type)
Zastaralé.

Zařadí data z nespravovaného bloku paměti do nově přiděleného spravovaného objektu zadaného typu.

PtrToStructure<T>(IntPtr)

Zařadí data z nespravovaného bloku paměti do nově přiděleného spravovaného objektu typu typu určeného parametrem obecného typu.

PtrToStructure<T>(IntPtr, T)

Zařadí data z nespravovaného bloku paměti do spravovaného objektu zadaného typu.

PtrToStructure(IntPtr, Object)

Zdroj:
Marshal.cs
Zdroj:
Marshal.cs
Zdroj:
Marshal.cs

Upozornění

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

Zařadí data z nespravovaného bloku paměti do spravovaného objektu.

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)

Parametry

ptr
IntPtr

nativeint

Ukazatel na nespravovaný blok paměti.

structure
Object

Objekt, do kterého mají být data zkopírována. Musí se jednat o instanci formátované třídy.

Atributy

Výjimky

Rozložení struktury není sekvenční ani explicitní.

-nebo-

Struktura je typ hodnoty v rámečku.

Poznámky

PtrToStructure je často nutné při volání zprostředkovatele komunikace com a platformy, pokud jsou parametry struktury reprezentovány jako System.IntPtr hodnota. Tuto metodu přetížení nelze použít s typy hodnot. Pokud se ptr parametr rovná IntPtr.Zero, null vrátí se .

Platí pro

PtrToStructure(IntPtr, Type)

Zdroj:
Marshal.cs
Zdroj:
Marshal.cs
Zdroj:
Marshal.cs

Upozornění

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

Zařadí data z nespravovaného bloku paměti do nově přiděleného spravovaného objektu zadaného typu.

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

Parametry

ptr
IntPtr

nativeint

Ukazatel na nespravovaný blok paměti.

structureType
Type

Typ objektu, který má být vytvořen. Tento objekt musí představovat formátovanou třídu nebo strukturu.

Návraty

Spravovaný objekt obsahující data, na která ptr ukazuje parametr .

Atributy

Výjimky

Rozložení structureType parametrů není sekvenční ani explicitní.

-nebo-

Parametr structureType je definice obecného typu.

structureType je null.

Třída určená parametrem structureType nemá přístupný konstruktor bez parametrů.

Příklady

Následující příklad vytvoří spravovanou strukturu, přenese ji do nespravované paměti a pak ji pomocí metody přenese zpět do spravované paměti PtrToStructure .

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

Následující příklad ukazuje, jak zařašovat nespravovaný blok paměti do spravované struktury pomocí PtrToStructure metody .

Důležité

Tento kód předpokládá 32bitovou kompilaci. Před použitím 64bitového kompilátoru nahraďte za IntPtr.ToInt32IntPtr.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);
        }

Poznámky

PtrToStructure je často nutné při volání zprostředkovatele komunikace com a platformy, pokud jsou parametry struktury reprezentovány jako System.IntPtr hodnota. Této metodě přetížení můžete předat typ hodnoty. V tomto případě je vrácený objekt instancí v rámečku. Pokud se ptr parametr rovná IntPtr.Zero, null vrátí se .

Viz také

Platí pro

PtrToStructure<T>(IntPtr)

Zdroj:
Marshal.cs
Zdroj:
Marshal.cs
Zdroj:
Marshal.cs

Zařadí data z nespravovaného bloku paměti do nově přiděleného spravovaného objektu typu typu určeného parametrem obecného typu.

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

Parametry typu

T

Typ objektu, do kterého mají být data zkopírována. Musí se jednat o formátovanou třídu nebo strukturu.

Parametry

ptr
IntPtr

nativeint

Ukazatel na nespravovaný blok paměti.

Návraty

T

Spravovaný objekt, který obsahuje data, na která ptr odkazuje parametr.

Atributy

Výjimky

Rozložení T není sekvenční ani explicitní.

Třída určená parametrem T nemá přístupný konstruktor bez parametrů.

Poznámky

PtrToStructure<T>(IntPtr) je často nutné při volání zprostředkovatele komunikace a platformy COM, pokud jsou parametry struktury reprezentovány jako System.IntPtr hodnoty. Do přetížení této metody můžete předat typ hodnoty. Pokud se ptr parametr rovná IntPtr.Zero a T je odkazovým typem, null vrátí se hodnota . Pokud ptr se IntPtr.Zero rovná a T je typ hodnoty, NullReferenceException vyvolá se hodnota .

Platí pro

PtrToStructure<T>(IntPtr, T)

Zdroj:
Marshal.cs
Zdroj:
Marshal.cs
Zdroj:
Marshal.cs

Zařadí data z nespravovaného bloku paměti do spravovaného objektu zadaného typu.

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)

Parametry typu

T

Typ .structure Musí se jednat o formátovanou třídu.

Parametry

ptr
IntPtr

nativeint

Ukazatel na nespravovaný blok paměti.

structure
T

Objekt, do kterého mají být data zkopírována.

Atributy

Výjimky

Rozložení struktury není sekvenční ani explicitní.

Poznámky

PtrToStructure<T>(IntPtr, T) je často nutné při volání zprostředkovatele komunikace a platformy COM, pokud jsou parametry struktury reprezentovány jako IntPtr hodnoty. U typů hodnot nelze použít přetížení této metody. Pokud se ptr parametr rovná IntPtr.Zero a T je odkazovým typem, null vrátí se hodnota . Pokud ptr se IntPtr.Zero rovná a T je typ hodnoty, NullReferenceException vyvolá se hodnota .

Platí pro