Announcement

Collapse
No announcement yet.

Array-Pointer bei DLL-Import (hoffentlich lesbar)

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

  • Array-Pointer bei DLL-Import (hoffentlich lesbar)

    Hallo C#-Gemeinde !<BR>
    <BR>
    Ich bemühe mich seit geraumer Zeit einen Zeiger auf ein Byte-Array <BR>
    an eine API-Funktion zu übergeben. Beim Erstellen des Projektes
    <BR>
    geht noch alles gut, allerdings schlägt der Aufruf der Funktion
    <BR>
    beim Debuggen mit folgender Meldung fehl :<BR>
    <BR>
    //<BR>
    <BR>
    Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' <BR>
    ist in WindowsApplication1.exe aufgetreten. <BR><BR>

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

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

    Hier die Deklaration und der Aufruf : <BR>
    <BR><PRE>
    public struct TVendorRequestIn <BR>
    { <BR>
    public byte Request;<BR>
    public ushort Value;<BR>
    public ushort Index;<BR>
    public ushort Length;<BR>
    public byte Direction;<BR>
    public byte Data;<BR>
    }<BR>
    <BR>

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

    public unsafe bool RdRamByte ( uint Handle, byte[] Buffer, <BR>
    ushort Addr, ref byte RetByte)<BR>
    {<BR>
    TVendorRequestIn VendorRequestIn;<BR>
    bool RetValue; uint nBytes = 0;<BR>
    // Initialisierung<BR>
    VendorRequestIn.Request = 0xA0; VendorRequestIn.Value = Addr;
    <BR>
    VendorRequestIn.Index = 0; VendorRequestIn.Length = 0;<BR>
    VendorRequestIn.Direction = DirectionRead; VendorRequestIn.Data = 0;
    <BR><BR>
    fixed ( byte* PtrBuffer = &Buffer[5] )<BR>
    {<BR>
    // Aufruf<BR>
    RetValue = IoControlRdRam(Handle, CTL_Ezusb_VENDOR_REQUEST,<BR>
    &VendorRequestIn, 10,<BR>
    PtrBuffer, Marshal.SizeOf(Buffer),<BR>
    &nBytes, 0);<BR>
    }<BR>
    RetByte = Buffer[0];<BR>
    return RetValue;<BR>
    }<BR><BR></PRE>

    Auch das genaue nachvollziehen des Beispieles mit <BR>
    "fixed ( byte* PtrBuffer = Buffer )"<BR>
    bringt keinen Erfolg !<BR>
    <BR>
    Bin nun leider am Ende mit meinem Latein und für jede Hilfe dankbar !<BR><BR>

    Grüsse Karsten!
Working...
X