Marshal.PtrToStructure メソッド

定義

アンマネージド メモリ ブロックからマネージド オブジェクトにデータをマーシャリングします。

オーバーロード

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

アンマネージド メモリ ブロックからマネージド オブジェクトにデータをマーシャリングします。

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

アンマネージド メモリ ブロックから、指定した型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。

PtrToStructure<T>(IntPtr)

[.NET Framework 4.5.1 以降のバージョンでサポート]

アンマネージド メモリ ブロックから、ジェネリック型パラメーターによって指定された型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。

PtrToStructure<T>(IntPtr, T)

[.NET Framework 4.5.1 以降のバージョンでサポート]

アンマネージド メモリ ブロックから、指定した型のマネージド オブジェクトにデータをマーシャリングします。

PtrToStructure(IntPtr, Object)

注意事項

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

アンマネージド メモリ ブロックからマネージド オブジェクトにデータをマーシャリングします。

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)

パラメーター

ptr
IntPtr

nativeint

アンマネージ メモリ ブロックへのポインター。

structure
Object

データのコピー先のオブジェクト。 これは、書式指定クラスのインスタンスである必要があります。

属性

例外

構造体のレイアウトがシーケンシャルまたは明示的ではありません。

または

構造体は、ボックス化された値型です。

注釈

PtrToStructure は、多くの場合、構造体パラメーターが値として表される場合に COM 相互運用機能とプラットフォーム呼び出しで必要になります System.IntPtr 。 このオーバーロード メソッドは、値型では使用できません。 パラメーターが ptr 等しい IntPtr.Zero場合は、 null 返されます。

適用対象

PtrToStructure(IntPtr, Type)

注意事項

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

アンマネージド メモリ ブロックから、指定した型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。

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

パラメーター

ptr
IntPtr

nativeint

アンマネージ メモリ ブロックへのポインター。

structureType
Type

作成するオブジェクトの型。 このオブジェクトは、書式指定クラスまたは構造体を表す必要があります。

戻り値

Object

ptr パラメーターが指すデータを格納しているマネージド オブジェクト。

属性

例外

structureType パラメーターのレイアウトがシーケンシャルまたは明示的ではありません。

または

structureType パラメーターがジェネリック型定義です。

structureTypenullです。

structureType で指定したクラスに、アクセスできるパラメーターなしのコンストラクターがありません。

次の例では、マネージド構造体を作成し、アンマネージ メモリに転送してから、メソッドを使用して 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

次の例では、メソッドを使用してアンマネージ メモリ ブロックをマネージド構造体にマーシャリングする方法を PtrToStructure 示します。

重要

このコードでは、32 ビットコンパイルを前提としています。 64 ビット コンパイラを使用する前に、次のように置き換えます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);
        }

注釈

PtrToStructure は、多くの場合、構造体パラメーターが値として表される場合に COM 相互運用機能とプラットフォーム呼び出しで必要になります System.IntPtr 。 このオーバーロード メソッドに値型を渡すことができます。 この場合、返されるオブジェクトはボックス化されたインスタンスです。 パラメーターが ptr 等しい IntPtr.Zero場合は、 null 返されます。

こちらもご覧ください

適用対象

PtrToStructure<T>(IntPtr)

[.NET Framework 4.5.1 以降のバージョンでサポート]

アンマネージド メモリ ブロックから、ジェネリック型パラメーターによって指定された型の、新しく割り当てられたマネージド オブジェクトにデータをマーシャリングします。

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

型パラメーター

T

データをコピーする先のオブジェクトの型。 これは、書式指定クラスまたは構造体である必要があります。

パラメーター

ptr
IntPtr

nativeint

アンマネージ メモリ ブロックへのポインター。

戻り値

T

ptr パラメーターが指すデータを格納しているマネージド オブジェクト。

属性

例外

T のレイアウトがシーケンシャルまたは明示的ではありません。

T で指定したクラスに、アクセスできるパラメーターなしのコンストラクターがありません。

注釈

PtrToStructure<T>(IntPtr) は、多くの場合、構造体パラメーターが値として System.IntPtr 表される場合に COM 相互運用機能とプラットフォーム呼び出しで必要になります。 このメソッドのオーバーロードに値型を渡すことができます。 パラメーターが ptr 等しい IntPtr.Zero場合は、 null 返されます。

適用対象

PtrToStructure<T>(IntPtr, T)

[.NET Framework 4.5.1 以降のバージョンでサポート]

アンマネージド メモリ ブロックから、指定した型のマネージド オブジェクトにデータをマーシャリングします。

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)

型パラメーター

T

structure の型。 書式が設定されたクラスである必要があります。

パラメーター

ptr
IntPtr

nativeint

アンマネージ メモリ ブロックへのポインター。

structure
T

データのコピー先のオブジェクト。

属性

例外

構造体のレイアウトがシーケンシャルまたは明示的ではありません。

注釈

PtrToStructure<T>(IntPtr, T) は、多くの場合、構造体パラメーターが値として IntPtr 表される場合に COM 相互運用機能とプラットフォーム呼び出しで必要になります。 このメソッドのオーバーロードを値型と共に使用することはできません。 パラメーターが ptr 等しい IntPtr.Zero場合は、 null 返されます。

適用対象