添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

This browser is no longer supported.

Upgrade to Microsoft Edge to take advantage of the latest features, security updates, and technical support.

Download Microsoft Edge More info about Internet Explorer and Microsoft Edge
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)

Parameters

Remarks

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. If the ptr parameter equals IntPtr.Zero , null will be returned.

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

Parameters

The type of object to be created. This object must represent a formatted class or a structure.

Returns

Examples

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)); // 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)) ' 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

The following example demonstrates how to marshal an unmanaged block of memory to a managed structure using the PtrToStructure method.

Important

This code assumes 32-bit compilation. 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); 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]; 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);

Remarks

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. If the ptr parameter equals IntPtr.Zero , null will be returned.

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

Type Parameters

Remarks

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. If the ptr parameter equals IntPtr.Zero and T is a reference type, null is returned. If ptr equals IntPtr.Zero and T is a value type, a NullReferenceException is thrown.

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)

Type Parameters

Remarks

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. If the ptr parameter equals IntPtr.Zero and T is a reference type, null is returned. If ptr equals IntPtr.Zero and T is a value type, a NullReferenceException is thrown.