IntPtr Struktur
TOC
Inhaltsverzeichnis reduzieren
Inhaltsverzeichnis erweitern
Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

IntPtr-Struktur

 

Ein plattformabhängiger Typ zur Darstellung von Zeigern und Handles.

Namespace:   System
Assembly:  mscorlib (in mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
public struct IntPtr : ISerializable

NameBeschreibung
System_CAPS_pubmethodIntPtr(Int32)

Initialisiert eine neue Instanz von IntPtr mit dem angegebenen 32-Bit-Zeiger bzw. -Handle.

System_CAPS_pubmethodIntPtr(Int64)

Initialisiert eine neue Instanz von IntPtr mit einem 64-Bit-Zeiger oder -Handle.

System_CAPS_pubmethodIntPtr(Void*)

Initialisiert eine neue Instanz von IntPtr mit dem angegebenen Zeiger auf einen nicht angegebenen Typ.

NameBeschreibung
System_CAPS_pubpropertySystem_CAPS_staticSize

Ruft die Größe dieser Instanz ab.

NameBeschreibung
System_CAPS_pubmethodSystem_CAPS_staticAdd(IntPtr, Int32)

Addiert einen Offset zum Wert eines Zeigers.

System_CAPS_pubmethodEquals(Object)

Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.(Setzt "ValueType.Equals(Object)" außer Kraft.)

System_CAPS_pubmethodGetHashCode()

Gibt den Hashcode für diese Instanz zurück.(Setzt "ValueType.GetHashCode()" außer Kraft.)

System_CAPS_pubmethodGetType()

Ruft den Type der aktuellen Instanz ab.(Geerbt von Object.)

System_CAPS_pubmethodSystem_CAPS_staticSubtract(IntPtr, Int32)

Subtrahiert einen Offset vom Wert eines Zeigers.

System_CAPS_pubmethodToInt32()

Konvertiert den Wert dieser Instanz in eine 32-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_pubmethodToInt64()

Konvertiert den Wert dieser Instanz in eine 64-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_pubmethodToPointer()

Konvertiert den Wert dieser Instanz in einen Zeiger auf einen nicht angegebenen Typ.

System_CAPS_pubmethodToString()

Konvertiert den numerischen Wert des aktuellen IntPtr-Objekts in die entsprechende Zeichenfolgendarstellung.(Setzt "ValueType.ToString()" außer Kraft.)

System_CAPS_pubmethodToString(String)

Konvertiert den numerischen Wert des aktuellen IntPtr-Objekts in die entsprechende Zeichenfolgendarstellung.

NameBeschreibung
System_CAPS_pubfieldSystem_CAPS_staticZero

Ein schreibgeschütztes Feld, das einen mit 0 (null) initialisierten Zeiger oder ein Handle darstellt.

NameBeschreibung
System_CAPS_puboperatorSystem_CAPS_staticAddition(IntPtr, Int32)

Addiert einen Offset zum Wert eines Zeigers.

System_CAPS_puboperatorSystem_CAPS_staticEquality(IntPtr, IntPtr)

Bestimmt, ob zwei angegebene Instanzen von IntPtr gleich sind.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Int32 to IntPtr)

Konvertiert den Wert einer 32-Bit-Ganzzahl mit Vorzeichen in einen IntPtr-Konstruktor.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Int64 to IntPtr)

Konvertiert den Wert einer 64-Bit-Ganzzahl mit Vorzeichen in einen IntPtr-Konstruktor.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Int32)

Konvertiert den Wert des angegebenen IntPtr-Konstruktors in eine 32-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Int64)

Konvertiert den Wert des angegebenen IntPtr-Konstruktors in eine 64-Bit-Ganzzahl mit Vorzeichen.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(IntPtr to Void*)

Konvertiert den Wert des angegebenen IntPtr in einen Zeiger auf einen nicht angegebenen Typ.

System_CAPS_puboperatorSystem_CAPS_staticExplicit(Void* to IntPtr)

Konvertiert den angegebenen Zeiger auf einen nicht angegebenen Typ in einen IntPtr.

System_CAPS_puboperatorSystem_CAPS_staticInequality(IntPtr, IntPtr)

Bestimmt, ob zwei angegebene Instanzen von IntPtr nicht gleich sind.

System_CAPS_puboperatorSystem_CAPS_staticSubtraction(IntPtr, Int32)

Subtrahiert einen Offset vom Wert eines Zeigers.

NameBeschreibung
System_CAPS_pubinterfaceSystem_CAPS_privmethodISerializable.GetObjectData(SerializationInfo, StreamingContext)

Füllt ein SerializationInfo-Objekt mit den für das Serialisieren des aktuellen IntPtr-Objekts erforderlichen Daten.

Die IntPtr ist eine ganze Zahl sein, dessen Größe plattformspezifisch ist, ausgelegt. D. h. muss eine Instanz dieses Typs auf 32-Bit-Hardware und Betriebssysteme die 32-Bit und 64-Bit auf 64-Bit-Hardware und Betriebssysteme sein.

Die IntPtr Typ kann von Sprachen, die Zeiger unterstützen, und als gemeinsame Methode zur Darstellung von Verweisen auf Daten zwischen Sprachen, die nicht unterstützen oder Zeiger verwendet werden.

IntPtr Objekte können auch dazu verwendet werden, Handles zu enthalten. Z. B. Instanzen von IntPtr dienen häufig in der System.IO.FileStream Klasse, um Dateihandles zu enthalten.

Die IntPtr Typ ist CLS-kompatibel ist, während die UIntPtr Typ ist. Nur die IntPtr bei der common Language Runtime verwendet wird. Die UIntPtr -Typ bereitgestellt hauptsächlich architektonischen Symmetrie mit verwalten die IntPtr Typ.

Dieser Typ implementiert die ISerializable Schnittstelle.

Im folgenden Beispiel wird die verwaltete Zeiger auf die Zeichen in einem Array umkehren. Nachdem er initialisiert ein String -Objekt und ruft seine Länge wird Folgendes:

  1. Ruft die Marshal.StringToHGlobalAnsi Methode, um die Unicode-Zeichenfolge an nicht verwalteten Speicher als ANSI-Zeichen (Einzelbyte) zu kopieren. Die Methode gibt ein IntPtr -Objekt, das auf den Anfang der nicht verwalteten Zeichenfolge zeigt. Visual Basic-Beispiel verwendet diesen Zeiger direkt; in C++ und c#-Beispielen wird es in einen Zeiger auf ein Byte umgewandelt.

  2. Ruft die Marshal.AllocHGlobal Methode, um die gleiche Anzahl von Bytes zu reservieren, wie die nicht verwaltete Zeichenfolge belegt. Die Methode gibt ein IntPtr Objekt, das am Anfang des nicht verwalteten Speicherblocks zeigt. Visual Basic-Beispiel verwendet diesen Zeiger direkt; in C++ und c#-Beispielen wird es in einen Zeiger auf ein Byte umgewandelt.

  3. Visual Basic-Beispiel definiert eine Variable namens offset die gleich der Länge der ANSI-Zeichenfolge ist. Hiermit wird den Offset in den nicht verwalteten Speicher zu ermitteln, in die nächste stehen in der ANSI-Zeichenfolge kopiert werden. Da Startwert die Länge der Zeichenfolge ist, wird der Kopiervorgang ein Zeichen vom Anfang der Zeichenfolge bis zum Ende des Speicherblocks kopieren.

    Der C#- und C++-Beispiele-Aufruf die ToPointer Methode, um einen nicht verwalteten Zeiger auf die Startadresse der Zeichenfolge und den nicht verwalteten Speicherblock abzurufen und sie fügen eine kleiner als die Länge der Zeichenfolge, die die Startadresse der ANSI-Zeichenfolge. Da der nicht verwalteten Zeichenfolgenzeiger bis zum Ende der Zeichenfolge verweist, wird der Kopiervorgang ein Zeichen vom Ende der Zeichenfolge an den Anfang des Speicherblocks kopieren.

  4. Verwendet eine Schleife um jedes Zeichen aus der Zeichenfolge in den nicht verwalteten Speicherblock zu kopieren.

    Das Visual Basic-Beispiel ruft die Marshal.ReadByte(IntPtr, Int32) Methode, um die Byte (oder ein-Byte-Zeichen) an einem angegebenen Offset aus dem verwalteten Zeiger auf die ANSI-Zeichenfolge zu lesen. Der Offset wird bei jeder Iteration der Schleife erhöht. Es ruft dann die Marshal.WriteByte(IntPtr, Int32, Byte) Methode zum Schreiben von Bytes in der Speicheradresse definiert die Startadresse des plus nicht verwalteten Speicherblock offset. Es wird dann verringert offset.

    Der C#- und C++-Beispiele führen Sie den Kopiervorgang und verringern den Zeiger auf die Adresse der nächsten Position in der nicht verwalteten ANSI-Zeichenfolge, und erhöhen den Zeiger auf die nächste Adresse im nicht verwalteten Block.

  5. Alle Beispiele rufen die Marshal.PtrToStringAnsi den nicht verwaltete Speicherblock mit der kopierten ANSI-Zeichenfolge in einen verwalteten Unicode konvertiert String Objekt.

  6. Rufen Sie nach dem Anzeigen von der ursprünglichen und umgekehrten Zeichenfolgen alle Beispiele die FreeHGlobal Methode, um den Arbeitsspeicher für die nicht verwalteten ANSI-Zeichenfolge und den nicht verwalteten Speicherblock freizugeben.

using System;
using System.Runtime.InteropServices;

class NotTooSafeStringReverse
{
    static public void Main()
    {
        string stringA = "I seem to be turned around!";
        int copylen = stringA.Length;

        // Allocate HGlobal memory for source and destination strings
        IntPtr sptr = Marshal.StringToHGlobalAnsi(stringA);
        IntPtr dptr = Marshal.AllocHGlobal(copylen + 1);

        // The unsafe section where byte pointers are used.
        unsafe
        {
            byte *src = (byte *)sptr.ToPointer();
            byte *dst = (byte *)dptr.ToPointer();

            if (copylen > 0)
            {
                // set the source pointer to the end of the string
                // to do a reverse copy.
                src += copylen - 1;

                while (copylen-- > 0)
                {
                    *dst++ = *src--;
                }
                *dst = 0;
            }
        }
        string stringB = Marshal.PtrToStringAnsi(dptr);

        Console.WriteLine("Original:\n{0}\n", stringA);
        Console.WriteLine("Reversed:\n{0}", stringB);

        // Free HGlobal memory
        Marshal.FreeHGlobal(dptr);
        Marshal.FreeHGlobal(sptr);
    }
}

// The progam has the following output:
//
// Original:
// I seem to be turned around!
//
// Reversed:
// !dnuora denrut eb ot mees I

Universal Windows Platform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portable Class Library
Unterstützt in: portable .NET platforms
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Dieser Typ ist threadsicher.

Zurück zum Anfang
Anzeigen:
© 2016 Microsoft