Announcement

Collapse
No announcement yet.

Array-Pointer bei DLL-Import

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Array-Pointer bei DLL-Import

    Hallo C#-Gemeinde !

    Ich bemühe mich seit geraumer Zeit einen Zeiger auf ein Byte-Array an eine
    API-Funktion zu übergeben. Beim Erstellen des Projektes geht noch alles
    gut, allerdings schlägt der Aufruf der Funktion beim Debuggen mit
    folgender Meldung fehl :

    //

    Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException'
    ist in WindowsApplication1.exe aufgetreten.

    Zusätzliche Informationen:
    Es kann keine sinnvolle Offsetgröße berechnet werden, da der Typ System.Byte[] nicht als nicht verwaltete Struktur gemarshallt werden kann.

    //

    Genau dieser Typ System.Byte[]
    wird aber in einem Bespielprogramm zu Visual C# verwendet.
    Die Compileroption /unsafe ist übrigens aktiviert.

    Hier die Deklaration und der Aufruf :

    public struct TVendorRequestIn
    {
    public byte Request;
    public ushort Value;
    public ushort Index;
    public ushort Length;
    public byte Direction;
    public byte Data;
    }

    [DllImport("kernel32.dll", EntryPoint = "DeviceIoControl")]
    unsafe internal static extern bool IoControlRdRam (uint Handle,
    uint IoControlCode,
    void* VendorRequestIn,
    int InBufferSize,
    void* BArray,
    int OutBufferSize,
    uint* ByteReturn,
    uint lpOverLapped);

    public unsafe bool RdRamByte ( uint Handle, byte[] Buffer, ushort Addr, ref byte RetByte)
    {
    TVendorRequestIn VendorRequestIn;
    bool RetValue; uint nBytes = 0;
    // Initialisierung
    VendorRequestIn.Request = 0xA0; VendorRequestIn.Value = Addr;
    VendorRequestIn.Index = 0; VendorRequestIn.Length = 0;
    VendorRequestIn.Direction = DirectionRead; VendorRequestIn.Data = 0;

    fixed ( byte* PtrBuffer = &Buffer[5] )
    {
    // Aufruf
    RetValue = IoControlRdRam(Handle, IOCTL_Ezusb_VENDOR_REQUEST,
    &VendorRequestIn, 10,
    PtrBuffer, Marshal.SizeOf(Buffer),
    &nBytes, 0);
    }
    RetByte = Buffer[0];
    return RetValue;
    }

    Auch das genaue nachvollziehen des Beispieles mit
    "fixed ( byte* PtrBuffer = Buffer )" {...}
    bringt keinen Erfolg !

    Bin nun leider am Ende mit meinem Latein und für jede Hilfe dankbar !

    Grüsse Karsten!
Working...
X