Evaluar y enviar comentarios
Contraer todo/Expandir todo Contraer todo
Esta página es específica de
Microsoft Visual Studio 2005/.NET Framework 2.0

Hay además otras versiones disponibles para:
Biblioteca de clases de .NET Framework
Marshal.StructureToPtr (Método)

Calcula las referencias a los datos desde un objeto administrado a un bloque de memoria no administrado.

Espacio de nombres: System.Runtime.InteropServices
Ensamblado: mscorlib (en mscorlib.dll)

Visual Basic (Declaración)
<ComVisibleAttribute(True)> _
Public Shared Sub StructureToPtr ( _
    structure As Object, _
    ptr As IntPtr, _
    fDeleteOld As Boolean _
)
Visual Basic (Uso)
Dim structure As Object
Dim ptr As IntPtr
Dim fDeleteOld As Boolean

Marshal.StructureToPtr(structure, ptr, fDeleteOld)
C#
[ComVisibleAttribute(true)] 
public static void StructureToPtr (
    Object structure,
    IntPtr ptr,
    bool fDeleteOld
)
C++
[ComVisibleAttribute(true)] 
public:
static void StructureToPtr (
    Object^ structure, 
    IntPtr ptr, 
    bool fDeleteOld
)
J#
/** @attribute ComVisibleAttribute(true) */ 
public static void StructureToPtr (
    Object structure, 
    IntPtr ptr, 
    boolean fDeleteOld
)
JScript
ComVisibleAttribute(true) 
public static function StructureToPtr (
    structure : Object, 
    ptr : IntPtr, 
    fDeleteOld : boolean
)

Parámetros

structure

Objeto administrado que contiene los datos que se van a calcular. Este objeto debe ser una instancia de una clase con formato.

ptr

Puntero a un bloque de memoria no administrada que debe ser asignado antes de llamar a este método.

fDeleteOld

true para permitir una llamada al método Marshal.DestroyStructure en el parámetro ptr antes de que se ejecute este método. Observe que pasar false puede provocar una pérdida de memoria.

Tipo de excepciónCondición

ArgumentException

El parámetro structure es un tipo genérico.

StructureToPtr copia el contenido de la estructura en el bloque de memoria previamente asignado al que apunta el parámetro ptr. Si el parámetro fDeleteOld es true, el búfer al que ptr apuntaba originalmente se elimina con la API de eliminación correspondiente en el puntero incrustado, pero el búfer debe contener datos válidos. Este método limpia cada campo de referencia especificado en la clase administrada reflejada.

Imagine que ptr apunta al bloque de memoria no administrada. El diseño de este bloque los describe la clase administrada correspondiente, structure. StructureToPtr calcula las referencias a los valores de campo desde una estructura a un puntero. Imagine que el bloque ptr incluye un campo de referencia, que apunta a un búfer de cadena que actualmente contiene "abc". Imagine que el campo correspondiente de la parte administrada es una cadena que contiene "vwxyz". Si no especifica lo contrario, StructureToPtr asigna un nuevo búfer no administrado para conservar "vwxyz" y lo enlaza con el bloque ptr. Esta acción dejará el antiguo búfer "abc" a la deriva sin liberarlo de nuevo al montón no administrado. Al final queda un búfer huérfano que representa una pérdida de memoria en el código. Si establece el parámetro fDeleteOld en true, StructureToPtr libera el búfer que contiene "abc" antes de asignar un nuevo búfer para "vwxyz".

NotaNota

Si desea fijar una estructura existente en lugar de copiarla, utilice el tipo System.Runtime.InteropServices.GCHandle para crear un identificador fijo para la estructura. Para obtener información detallada sobre cómo fijar una estructura, vea Copiar y fijar.

NotaNota

Este método utiliza SecurityAction.LinkDemand para evitar que se le llame desde código que no sea de confianza; sólo el llamador inmediato debe disponer del permiso SecurityPermissionAttribute.UnmanagedCode. Si se puede llamar al código desde código de confianza parcial, no pase ninguna entrada de usuario a los métodos de la clase Marshal sin validación. Para conocer las limitaciones importantes que existen a la hora de utilizar el miembro LinkDemand, vea Demand frente a LinkDemand.

En el siguiente ejemplo de código se crea una estructura administrada, se transfiere a la memoria no administrada usando el método StructureToPtr y, a continuación, se transfiere de nuevo a la memoria administrada usando el método PtrToStructure.

Visual Basic
Imports System
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

C#
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);
        }
        


    }

}

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium, Windows Mobile para Pocket PC, Windows Mobile para Smartphone, Windows Server 2003, Windows XP Media Center, Windows XP Professional x64, Windows XP SP2, Windows XP Starter Edition

.NET Framework no admite todas las versiones de cada plataforma. Para obtener una lista de las versiones admitidas, vea Requisitos del sistema.

.NET Framework

Compatible con: 2.0, 1.1, 1.0

.NET Compact Framework

Compatible con: 2.0, 1.0
Contenido de la comunidad   ¿Qué es Community Content?
Agregar contenido nuevo RSS  Anotaciones
Processing
© 2012 Microsoft. Reservados todos los derechos. Términos de uso | Marcas Registradas | Privacidad
Page view tracker