Wertübergabe an und von DLL

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Ekkehard.

    Wertübergabe an und von DLL

    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:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. ' Definition
    3. <DllImport("USB_Support.dll", EntryPoint:="USB_XferPipe", CallingConvention:=CallingConvention.StdCall)>
    4. Public Shared Function USB_XferPipe(ByVal dev As UInt16, ByVal buf() As Byte, ByVal bytecnt As UInt32) As UInt16
    5. End Function
    6. 'Aufruf
    7. Dim r As UInt16
    8. Dim dev As UInt16
    9. Dim buf() As Byte = {0, 0, 0, 0, 0, 0, 0, 0}
    10. Dim bytecnt As UInt32 = 8
    11. 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!
    Willkommen im Forum. :thumbup:
    Deine Informationen sind leider etwas dürftig. Kannst Du uns da noch etwas mehr mitteilen?
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die schnelle Antwort.
    Der Zugriff auf meine DLL ist aber prinzipiell möglich, zwei Funktionen funktionieren immerhin. Einmal wird nur ein Wert übergeben, bei der zweiten Funktion kommen die richtigen Werte in ein Array devList(127,3) as UInt16 zurück. Es ist also kein prinzipielles Problem. Nur mit der geschilderten Funktion habe ich Probleme. In Zeile 14 (s.o.) tritt der o.g. Fehler auf.

    RodFromGermany schrieb:

    Deine Informationen sind leider etwas dürftig. Kannst Du uns da noch etwas mehr mitteilen?
    Gerne! Was fehlt noch?
    WinXP32, VB2010
    Spoiler anzeigen
    System.AccessViolationException wurde nicht behandelt.
    Message=Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
    Source=SchulzUSB
    StackTrace:
    bei SchulzUSB.Form1.USB_XferPipe(UInt16 dev, Byte[] buf, UInt32 bytecnt)
    bei SchulzUSB.Form1.Button1_Click() in C:\Dokumente und Einstellungen\e\eigene dateien\visual studio 2010\Projects\SchulzUSB\SchulzUSB\Form1.vb:Zeile 59.
    bei SchulzUSB.Form1._Lambda$__1(Object a0, EventArgs a1) in C:\Dokumente und Einstellungen\e\eigene dateien\visual studio 2010\Projects\SchulzUSB\SchulzUSB\Form1.Designer.vb:Zeile 0.
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.ButtonBase.OnKeyUp(KeyEventArgs kevent)
    bei System.Windows.Forms.Control.ProcessKeyEventArgs(Message& m)
    bei System.Windows.Forms.Control.ProcessKeyMessage(Message& m)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei SchulzUSB.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:

    Ekkehard schrieb:

    Was fehlt noch?
    Wo kommt denn die DLL her?
    In welcher Sprache ist sie geschrieben?
    Hast Du deren Quellcode?
    ----------
    Kann es sein, dass da drinnen einfach nur falsch auf das Array zugegriffen wird?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Fehler gefunden!

    Die Übergabe von Werten an/von der DLL ist nach meinem Verständnis nicht ganz logisch.

    Wenn ich direkt eine Zahl übergebe, muss bei der Funktionsdefinition ByVal verwendet werden.
    Wenn ich einen Pointer auf eine Zahl übergebe, muss bei der Funktionsdefinition ByRef verwendet werden. Soweit logisch.
    Wenn ich jedoch einen Pointer auf ein 1D oder 2D Array übergeben soll, muss bei der Funktionsdefinition ByVal verwendet werden.

    Die DLL gehört zu einem USB-Adapter von einem Netzteil (delta-elektronika)