Share via


Beispiel zu "void"

Diese Beispiel demonstriert, wie Daten an eine nicht verwaltete Funktion übergeben werden, die als Argument einen void-Zeiger erwartet. Das Beispiel stellt zwei Lösungen vor.

Das Void-Beispiel verwendet die folgende nicht verwaltete Funktion, die zusammen mit ihrer ursprünglichen Funktionsdeklaration aufgeführt wird:

  • SetData aus PinvokeLib.dll exportiert.

    void SetData(DataType typ, void* object)
    

PInvokeLib.dll ist eine benutzerdefinierte nicht verwaltete Bibliothek, die eine Implementierung für die zuvor aufgelistete Funktion enthält.

In diesem Beispiel enthält die LibWrap-Klasse eine Enumeration von Typen und zwei verwaltete Prototypmethoden: SetData und SetData2. Diese Methoden stellen die folgenden Vorgehensweisen für die Übergabe von Daten an eine nicht verwaltete Funktion dar, die void* erwartet:

  • SetData deklariert die DataType-Enumeration und ein Objekt. Das MarshalAsAttribute-Attribut legt die UnmanagedType-Enumeration auf AsAny fest. Dadurch wird der Typ eines Objekts zur Laufzeit bestimmt und das Objekt als dieser Typ gemarshallt.

  • SetData2 überlädt die Methode, um die DataType-Enumeration zu deklarieren und einen double- oder string-Typ zu identifizieren. Das Schlüsselwort ref (ByRef in Visual Basic) übergibt den double-Typ durch einen Verweis.

Die App-Klasse ruft die Methoden auf und initialisiert die Enumerationselemente. Bei der ersten Vorgehensvariante wird jedes Enumerationselement angegeben, bei der zweiten nur der größte Werttyp und die Zeichenfolge.

Deklarieren von Prototypen

Public Class LibWrap
    Public Enum DataType
        DT_I2 = 1
        DT_I4
        DT_R4
        DT_R8
        DT_STR
    End Enum

    ' Uses AsAny when void* is expected.
    Declare Sub SetData Lib "..\LIB\PInvokeLib.dll" ( _
        ByVal t As DataType, _
        <MarshalAs(UnmanagedType.AsAny)> ByVal o As Object)

    ' Uses overloading when void* is expected.
    Overloads Declare Sub SetData2 Lib "..\LIB\PInvokeLib.dll" Alias _
        "SetData" (ByVal t As DataType, ByRef d As Double)

    Overloads Declare Sub SetData2 Lib "..\LIB\PInvokeLib.dll" Alias _
        "SetData" (ByVal t As DataType, ByVal s As String)
End Class
public class LibWrap
{
    public enum DataType
    {
        DT_I2 = 1,
        DT_I4,
        DT_R4,
        DT_R8,
        DT_STR
    }

    // Uses AsAny when void* is expected.
    [DllImport( "..\\LIB\\PInvokeLib.dll" )]
    public static extern void SetData(DataType t,
        [MarshalAs(UnmanagedType.AsAny)] object o);

    // Uses overloading when void* is expected.
    [DllImport("..\\LIB\\PInvokeLib.dll", EntryPoint="SetData")]
    public static extern void SetData2(DataType t, ref double i);

    [DllImport("..\\LIB\\PInvokeLib.dll", EntryPoint="SetData")]
    public static extern void SetData2(DataType t, string s);
}
public ref class LibWrap
{
public:
    enum class DataType
    {
        DT_I2 = 1,
        DT_I4,
        DT_R4,
        DT_R8,
        DT_STR
    };

    // Uses AsAny when void* is expected.
    [DllImport("..\\LIB\\PInvokeLib.dll")]
    static void SetData(DataType t,
        [MarshalAs(UnmanagedType::AsAny)] Object^ o);

    // Uses overloading when void* is expected.
    [DllImport("..\\LIB\\PInvokeLib.dll", EntryPoint="SetData")]
    static void SetData2( DataType t, double% i);

    [DllImport("..\\LIB\\PInvokeLib.dll", EntryPoint="SetData")]
    static void SetData2( DataType t, String^ s);
};

Aufrufen von Funktionen

Public Class App
   Public Shared Sub Main()
        Console.WriteLine("Calling SetData using AsAny..." + vbNewLine)
        LibWrap.SetData(LibWrap.DataType.DT_I2, CShort(12))
        LibWrap.SetData(LibWrap.DataType.DT_I4, CLng(12))
        LibWrap.SetData(LibWrap.DataType.DT_R4, CSng(12))
        LibWrap.SetData(LibWrap.DataType.DT_R8, CDbl(12))
        LibWrap.SetData(LibWrap.DataType.DT_STR, "abcd")

        Console.WriteLine(vbNewLine + "Calling SetData using overloading...")
        Console.WriteLine(vbNewLine)
        Dim d As Double = 12
        LibWrap.SetData2(LibWrap.DataType.DT_R8, d)
        LibWrap.SetData2(LibWrap.DataType.DT_STR, "abcd")
    End Sub
End Class
public class App
{
    public static void Main()
    {
        Console.WriteLine("Calling SetData using AsAny... \n");
        LibWrap.SetData(LibWrap.DataType.DT_I2, (short)12);
        LibWrap.SetData(LibWrap.DataType.DT_I4, (long)12);
        LibWrap.SetData(LibWrap.DataType.DT_R4, (float)12);
        LibWrap.SetData(LibWrap.DataType.DT_R8, (double)12);
        LibWrap.SetData(LibWrap.DataType.DT_STR, "abcd");

        Console.WriteLine("\nCalling SetData using overloading... \n");
        double d = 12;
        LibWrap.SetData2(LibWrap.DataType.DT_R8, ref d);
        LibWrap.SetData2(LibWrap.DataType.DT_STR, "abcd");
    }
}
public class App
{
public:
    static void Main()
    {
        Console::WriteLine("Calling SetData using AsAny... \n");
        LibWrap::SetData(LibWrap::DataType::DT_I2, (short)12);
        LibWrap::SetData(LibWrap::DataType::DT_I4, (long)12);
        LibWrap::SetData(LibWrap::DataType::DT_R4, (float)12);
        LibWrap::SetData(LibWrap::DataType::DT_R8, (double)12);
        LibWrap::SetData(LibWrap::DataType::DT_STR, "abcd");

        Console::WriteLine("\nCalling SetData using overloading... \n");
        double d = 12;
        LibWrap::SetData2(LibWrap::DataType::DT_R8, d);
        LibWrap::SetData2(LibWrap::DataType::DT_STR, "abcd");
    }
};

Siehe auch

Konzepte

Verschiedene Marshallingbeispiele

Datentypen für den Plattformaufruf

Erstellen von Prototypen in verwaltetem Code