Ich möchte in einem VB 2010 Projekt eine Funktion einer DLL aufrufen. Es tritt immer die Fehlermeldung "AccessViolationException ... es wurde versucht, im geschützten Speicher zu schreiben ..." auf.
Der Funktion sollen drei Variablen übergeben werden, die erste direkt, die beiden weiteren als "Pointer". Aber wie unterscheide ich das?
Bei einer anderen Funktion der gleichen DLL wird auch ein Array zurückgegeben. Dort funktioniert die Rückgabe mit ByVal, bei ByRef kommt eine Fehlermeldung.
Hier der Ausschnitt aus meinem Code:
Sieht jemand, wo mein Fehler liegen könnte??
Folgende Informationen habe ich (leider gibt es nur einen Beispiel-Code für Delphi):
* Aufrufkonvention stdcall
* function USB_XferPipe(USB_Device:word;var buf:TBuffer;var bytecnt: DWord):Word;stdcall;
* das erste Argument soll direkt übergeben werden, Nr. 2 und 3 als Pointer
* Device: Word;
* buf: TDBuffer=Array[0..7] of byte;
* bytecnt: Dword Länge des Buffers, immer =8 setzen!
Der Funktion sollen drei Variablen übergeben werden, die erste direkt, die beiden weiteren als "Pointer". Aber wie unterscheide ich das?
Bei einer anderen Funktion der gleichen DLL wird auch ein Array zurückgegeben. Dort funktioniert die Rückgabe mit ByVal, bei ByRef kommt eine Fehlermeldung.
Hier der Ausschnitt aus meinem Code:
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- ' Definition
- <DllImport("USB_Support.dll", EntryPoint:="USB_XferPipe", CallingConvention:=CallingConvention.StdCall)>
- Public Shared Function USB_XferPipe(ByVal dev As UInt16, ByVal buf() As Byte, ByVal bytecnt As UInt32) As UInt16
- End Function
- 'Aufruf
- Dim r As UInt16
- Dim dev As UInt16
- Dim buf() As Byte = {0, 0, 0, 0, 0, 0, 0, 0}
- Dim bytecnt As UInt32 = 8
- r = USB_XferPipe(dev, buf, bytecnt)
Sieht jemand, wo mein Fehler liegen könnte??
Folgende Informationen habe ich (leider gibt es nur einen Beispiel-Code für Delphi):
* Aufrufkonvention stdcall
* function USB_XferPipe(USB_Device:word;var buf:TBuffer;var bytecnt: DWord):Word;stdcall;
* das erste Argument soll direkt übergeben werden, Nr. 2 und 3 als Pointer
* Device: Word;
* buf: TDBuffer=Array[0..7] of byte;
* bytecnt: Dword Länge des Buffers, immer =8 setzen!