Marshal.PtrToStructure メソッド

定義

アンマネージド メモリ ブロックからマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a managed object.

オーバーロード

PtrToStructure(IntPtr, Object)
互換性のために残されています。

アンマネージド メモリ ブロックからマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a managed object.

PtrToStructure(IntPtr, Type)
互換性のために残されています。

アンマネージド メモリ ブロックから、指定した型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a newly allocated managed object of the specified type.

PtrToStructure<T>(IntPtr)

[.NET Framework 4.5.1 以降のバージョンでサポート][Supported in the .NET Framework 4.5.1 and later versions]

アンマネージド メモリ ブロックから、ジェネリック型パラメーターによって指定された型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a newly allocated managed object of the type specified by a generic type parameter.

PtrToStructure<T>(IntPtr, T)

[.NET Framework 4.5.1 以降のバージョンでサポート][Supported in the .NET Framework 4.5.1 and later versions]

アンマネージド メモリ ブロックから、指定した型のマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a managed object of the specified type.

PtrToStructure(IntPtr, Object)

警告: 廃止

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

アンマネージド メモリ ブロックからマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a managed object.

public:
 static void PtrToStructure(IntPtr ptr, System::Object ^ structure);
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]
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);
static member PtrToStructure : nativeint * obj -> unit
[<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
[<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)

パラメーター

ptr
IntPtr

アンマネージ メモリ ブロックへのポインター。A pointer to an unmanaged block of memory.

structure
Object

データのコピー先のオブジェクト。The object to which the data is to be copied. これは、書式指定クラスのインスタンスである必要があります。This must be an instance of a formatted class.

属性

例外

構造体のレイアウトがシーケンシャルまたは明示的ではありません。Structure layout is not sequential or explicit.

- または --or-

構造体は、ボックス化された値型です。Structure is a boxed value type.

注釈

PtrToStructure は、構造体パラメーターが値として表されるときに COM 相互運用機能とプラットフォーム呼び出しで必要になることがよくあり System.IntPtr ます。PtrToStructure is often necessary in COM interop and platform invoke when structure parameters are represented as an System.IntPtr value. このオーバーロードメソッドを値型と共に使用することはできません。You cannot use this overload method with value types.

PtrToStructure(IntPtr, Type)

警告: 廃止

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

アンマネージド メモリ ブロックから、指定した型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a newly allocated managed object of the specified type.

public:
 static System::Object ^ PtrToStructure(IntPtr ptr, Type ^ structureType);
public static object PtrToStructure (IntPtr ptr, Type structureType);
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]
public static object PtrToStructure (IntPtr ptr, Type structureType);
[System.Security.SecurityCritical]
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);
static member PtrToStructure : nativeint * Type -> obj
[<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
[<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

パラメーター

ptr
IntPtr

アンマネージ メモリ ブロックへのポインター。A pointer to an unmanaged block of memory.

structureType
Type

作成するオブジェクトの型。The type of object to be created. このオブジェクトは、書式指定クラスまたは構造体を表す必要があります。This object must represent a formatted class or a structure.

戻り値

Object

ptr パラメーターが指すデータを格納しているマネージド オブジェクト。A managed object containing the data pointed to by the ptr parameter.

属性

例外

structureType パラメーターのレイアウトがシーケンシャルまたは明示的ではありません。The structureType parameter layout is not sequential or explicit.

- または --or- structureType パラメーターがジェネリック型定義です。The structureType parameter is a generic type definition.

structureTypenullです。structureType is null.

structureType で指定したクラスに、アクセスできるパラメーターなしのコンストラクターがありません。The class specified by structureType does not have an accessible parameterless constructor.

次の例では、マネージ構造体を作成し、アンマネージメモリに転送した後、メソッドを使用してマネージメモリに転送し PtrToStructure ます。The following example creates a managed structure, transfers it to unmanaged memory, and then transfers it back to managed memory using the PtrToStructure method.

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


次の例は、メソッドを使用して、アンマネージメモリブロックをマネージ構造体にマーシャリングする方法を示して PtrToStructure います。The following example demonstrates how to marshal an unmanaged block of memory to a managed structure using the PtrToStructure method.

重要

このコードは、32ビットのコンパイルを前提としています。This code assumes 32-bit compilation. 64ビットコンパイラを使用する前に、を IntPtr.ToInt32 に置き換え IntPtr.ToInt64 ます。Before using a 64-bit compiler, replace IntPtr.ToInt32 with 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);
        }

注釈

PtrToStructure は、構造体パラメーターが値として表されるときに COM 相互運用機能とプラットフォーム呼び出しで必要になることがよくあり System.IntPtr ます。PtrToStructure is often necessary in COM interop and platform invoke when structure parameters are represented as an System.IntPtr value. このオーバーロードメソッドに値型を渡すことができます。You can pass a value type to this overload method. この場合、返されるオブジェクトはボックス化されたインスタンスです。In this case, the returned object is a boxed instance.

こちらもご覧ください

PtrToStructure<T>(IntPtr)

[.NET Framework 4.5.1 以降のバージョンでサポート][Supported in the .NET Framework 4.5.1 and later versions]

アンマネージド メモリ ブロックから、ジェネリック型パラメーターによって指定された型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a newly allocated managed object of the type specified by a generic type parameter.

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

型パラメーター

T

データをコピーする先のオブジェクトの型。The type of the object to which the data is to be copied. これは、書式指定クラスまたは構造体である必要があります。This must be a formatted class or a structure.

パラメーター

ptr
IntPtr

アンマネージ メモリ ブロックへのポインター。A pointer to an unmanaged block of memory.

戻り値

T

ptr パラメーターが指すデータを格納しているマネージド オブジェクト。A managed object that contains the data that the ptr parameter points to.

属性

例外

T のレイアウトがシーケンシャルまたは明示的ではありません。The layout of T is not sequential or explicit.

T で指定したクラスに、アクセスできるパラメーターなしのコンストラクターがありません。The class specified by T does not have an accessible parameterless constructor.

注釈

PtrToStructure<T>(IntPtr) は、構造体パラメーターが値として表されるときに COM 相互運用機能とプラットフォーム呼び出しで必要になることがよくあり System.IntPtr ます。PtrToStructure<T>(IntPtr) is often necessary in COM interop and platform invoke when structure parameters are represented as System.IntPtr values. このメソッドオーバーロードに値型を渡すことができます。You can pass a value type to this method overload.

PtrToStructure<T>(IntPtr, T)

[.NET Framework 4.5.1 以降のバージョンでサポート][Supported in the .NET Framework 4.5.1 and later versions]

アンマネージド メモリ ブロックから、指定した型のマネージド オブジェクトにデータをマーシャリングします。Marshals data from an unmanaged block of memory to a managed object of the specified type.

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

型パラメーター

T

structure の型。The type of structure. 書式が設定されたクラスである必要があります。This must be a formatted class.

パラメーター

ptr
IntPtr

アンマネージ メモリ ブロックへのポインター。A pointer to an unmanaged block of memory.

structure
T

データのコピー先のオブジェクト。The object to which the data is to be copied.

属性

例外

構造体のレイアウトがシーケンシャルまたは明示的ではありません。Structure layout is not sequential or explicit.

注釈

PtrToStructure<T>(IntPtr, T) は、構造体パラメーターが値として表されるときに COM 相互運用機能とプラットフォーム呼び出しで必要になることがよくあり IntPtr ます。PtrToStructure<T>(IntPtr, T) is often necessary in COM interop and platform invoke when structure parameters are represented as IntPtr values. このメソッドオーバーロードを値型と共に使用することはできません。You cannot use this method overload with value types.

適用対象