DllImport einer C-DLL von Burster

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 37 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    @RodFromGermany

    RodFromGermany schrieb:

    Auch das habe ich hinter mir, dort wird gesagt, dass der Eintrittspunkt nicht gefunden wurde.

    Wahrscheinlich weil die Funktionsnamen in der 8661.dll etwas anders sind als in der bp8661.dll. Schau mal in die 8661.h oder lass bp8661_ bei dem Funktionsnamen weg. Aus bp8661_OpenInterface aus der bp8661.dll wird OpenInterface in der 8661.dll. k.A ob Du schon in den Download aus Post 10 reingeschaut hast. Da sind alle erforderlichen Header-, LIB- und C-Files vorhanden.

    Davon mal ab. Bei den Subs GetLibVersion (max. 20 chars + termination), GetLibCreationDate (max. 10 chars + termination) und GetLibManufacturerInfo (max. 86 chars + termination), alles Variable Type: char array (pointer on char array), aus der 8661.dll bekomme ich nur den Fehler 0xc0000417 (STATUS_INVALID_CRUNTIME_PARAMETER) zurück. Wahrscheinlich weil, laut bp8661.c-File, hier nur die Constanten DLL_VERSION, DLL_MANUFACTURER und DLL_CREATION_DATE für die Rückgabe verwendet werden und nicht wie vermutet die Werte aus der DLL selber.

    Ansonsten funktionieren Funktionen wie SetInterfaceConfiguration und OpenInterface aus der 8661.dll hingegen problemlos. Wobei letztere bei mir den Fehler -121 (READ_ERROR) zurückliefert da kein passendes Gerät (StepMotor/Sensor) bei mir an Com1 angeschlossen ist von dem gelesen werden könnte weswegen man hier nicht weiter testen kann da kein valider PortHandle vorhanden ist. Bin dennoch der Meinung das für die Funktion GetSerialNr ein entsprechender Puffer (String, StringBuilder oder ByteArray, ByVal oder ByRef bzw. entsprechend gemarshalt (Pointer)) übergeben werden kann um die Werte auszulesen.
    Mfg -Franky-

    -Franky- schrieb:

    Wahrscheinlich weil die Funktionsnamen in der 8661.dll etwas anders sind als in der bp8661.dll.
    Völlig anders. Ich hab natürlich sofort den Dependency Viewer befragt. ;)
    Und:
    Ich hab schon mal erfolgreich ne fremde C-DLL gewrappt.
    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!
    @RodFromGermany Das kann ich so nicht nachvollziehen.

    @-Franky- Man kann meiner Meinung nach die DLL auch ohne Sensor austesten.
    Die Funktionen Sub bp8661_GetLibVersion (??libVersion??) oder Sub bp8661_GetLibManufacturerInfo (??libManufacturerInfo??) benötigen keinen Zugriff auf einen Sensor.

    Ich möchte nochmals bemerken: Grundsätzlich funktioniert der Aufruf von Funktionen der DLL. Ich habe erfolgreich Bsp. die Funktion ​Function bp8661_OpenInterface& (ByVal comPort&) oder die oben genannte ​GetLibVersion aufgerufen und auch ein Resultat erhalten. Aber bei der Funktionen ​GetLibManufacturerInfo oder ​GetValues bekomme ich die Fehlermeldung!

    Was ein wenig komisch ist, das Bsp. GetLibVersion funktioniert, welche einen Pointer auf ein Char-Array mit der Länge 11 zurückgibt, aber die GetLibManufacturerInfo nicht, mit einem Pointer auf ein Char-Array der Länge 87.


    VB.NET-Quellcode

    1. <DllImport("bp8661.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Auto, ExactSpelling:=True)>
    2. Public Shared Sub bp8661_GetLibVersion(<MarshalAs(UnmanagedType.LPStr)> libVersion As System.Text.StringBuilder)
    3. End Sub
    4. <DllImport("bp8661.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Auto, ExactSpelling:=True)>Public Shared Sub bp8661_GetLibManufacturerInfo (<MarshalAs(UnmanagedType.LPStr)> libManInfo As System.Text.StringBuilder)End Sub

    ElmarElefant schrieb:

    Das kann ich so nicht nachvollziehen.
    Poste ein bei Dir compilier- und ausführbares Projekt ggf. mit falschen Deklarationen.
    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!
    @ElmarElefant Als erstes machst Du Option Strict On :!:
    Visual Studio - Empfohlene Einstellungen
    GetError() gibt keine Exception zurück, sondern einen String.
    Mit was für einer Hardware kommuniziert diese DLL?
    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!
    @ElmarElefant

    Ich kann Dein Projekt nicht testen. Fehlermeldung: Die bp8661.dll wird nicht gefunden. Selbst dann nicht, wenn ich explizit den Pfad angebe, wo sich die DLL befindet. Könnte sein das da weitere Abhängigkeiten für diese DLL fehlen die wir nicht haben. Wie auch immer. Ich kann nur Funktionen aus der 8661.dll testen und für die Subs GetLibVersion, GetLibCreationDate und GetLibManufacturerInfo erhalte ich den Fehler Fehler 0xc0000417 (STATUS_INVALID_CRUNTIME_PARAMETER) zurück. Wenn man in die bp8661.c schaut, werden entsprechende Subs aus der 8661.dll auch nicht aufgerufen. Stattdessen wird nur das zurückgeliefert, was in den Konstanten DLL_VERSION, DLL_MANUFACTURER und DLL_CREATION_DATE steht.

    C-Quellcode

    1. #define DLL_VERSION "2017.1.0.0"
    2. // Read-out DLL software version | Softwareversion der DLL auslesen
    3. void bp8661_GetLibVersion (char * chrVersion)
    4. {
    5. // return DLL-Softwareversion
    6. sprintf(chrVersion,"%s", DLL_VERSION);
    7. }

    Die anderen Funktionen aus der 8661.dll, bis auf SetInterfaceConfiguration und OpenInterface (<- liefert aber READ_ERROR zurück), kann man auch nicht testen da uns ein entsprechendes, angeschlossenens Gerät fehlt und man somit kein gültiges Handle auf einen COM-Port bekommt.
    Mfg -Franky-

    RodFromGermany schrieb:

    <a href="https://www.vb-paradise.de/index.php/User/27565-ElmarElefant/">@ElmarElefant</a> Als erstes machst Du <span style="font-size: 14pt"><b>Option Strict On</b></span> <img src="https://www.vb-paradise.de/wcf/images/smilies/attention.png" alt=":!:" />
    <a href="https://www.vb-paradise.de/index.php/Thread/105413-Visual-Studio-Empfohlene-Einstellungen/">Visual Studio - Empfohlene Einstellungen</a>
    <code class="inlineCode">GetError()</code> gibt keine <code class="inlineCode">Exception</code> zurück, sondern einen <code class="inlineCode">String</code>.
    Mit was für einer Hardware kommuniziert diese DLL?


    Der Fehler wird nicht von der DLL ausgelöst, sondern beim Debuggen von Visual Studio.



    -Franky- schrieb:

    <a href="https://www.vb-paradise.de/index.php/User/27565-ElmarElefant/">@ElmarElefant</a>
    Ich kann Dein Projekt nicht testen. Fehlermeldung: Die bp8661.dll wird nicht gefunden. Selbst dann nicht, wenn ich explizit den Pfad angebe, wo sich die DLL befindet. Könnte sein das da weitere Abhängigkeiten für diese DLL fehlen die…


    Von Burster habe ich eine Installationsdatei erhalten. Es scheint so zu sein, dass mit dieser Installation noch weitere benötigte Dateien mitgeliefert werden.
    burster.de/fileadmin/user_uplo…ntDriverInstallX64_EN.zip

    Auch wenn die Funktion nur eine Konstante zurückgibt, ist sie doch perfekt zum austesten. Auf jeden Fall funktioniert der Aufruf von GetLibVersion bei mir problemlos, aber GetLibManufacturerInfo nicht. Und aus meiner Sicht ist der einzige Unterschied die Länge des Array.
    @ElmarElefant Machst Du zunächst Option Strict On :!:
    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!
    @Facebamm Nach der merkwürdigen Antwort in Postr #28 muss man wohl davon ausgehen.
    Solange da nix passiert, und solange nicht alle Fragen beantwortet sind, mach ich soeieso nix mehr 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!

    RodFromGermany schrieb:

    @Facebamm Nach der merkwürdigen Antwort in Postr #28 muss man wohl davon ausgehen.
    Solange da nix passiert, und solange nicht alle Fragen beantwortet sind, mach ich soeieso nix mehr hier.


    Wieso so aggressiv. Was war den an der Antwort merkwürdig? Ich mache gerne heute Abend "Strict On" und schreibe Dir dann gerne ob was positives dabei rauskam.
    Tatsache ist, dass ich noch nie die GetError-Funktion der DLL verwendet habe und wie geschrieben der Fehler eine Exception bei Aufruf der Wrapper-Funktion (Bsp. GetLibManufacturerInfo) ist. Selbst wenn durch die DLL ein String (Char-Array) als Fehlermeldung ausgeben würde, kann ich dieses nicht abfragen, da das Programm vorher hängenbleibt.
    Da kannst Du mal sehen, dass ich einige Ebenen tiefer komme als Du.
    Und da war noch eine unbeantwortete Frage:

    RodFromGermany schrieb:

    Mit was für einer Hardware kommuniziert diese DLL?
    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!

    ElmarElefant schrieb:

    Auch wenn ich's nicht verstehe
    Aus diesen Überlegungen kommt die Aufforderung an Dich, Fehlertexte als String und nicht als Exception zu generieren.
    Da kommt die Vermutung auf, dass Du gar nicht weißt, wozu solch Exceptions gut sind.
    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!
    Ich werde morgen versuchen den Hersteller zu kontaktieren, ev. ist der Sensor hinüber.

    RodFromGermany schrieb:

    ElmarElefant schrieb:

    Auch wenn ich's nicht verstehe
    Aus diesen Überlegungen kommt die Aufforderung an Dich, Fehlertexte als String und nicht als Exception zu generieren.Da kommt die Vermutung auf, dass Du gar nicht weißt, wozu solch Exceptions gut sind.


    Aufforderung?
    Ich habe mir die Funktion GetError angeschaut. Wahrscheinlich hatte der Ersteller dies im Auge: docs.microsoft.com/en-us/dotne…exception-builder-methods
    Ich hätte es wohl auch so gemacht, auch wenn es den hohen Anforderungen scheinbar nicht gerecht wird. Aber eine Aufforderung...

    ElmarElefant schrieb:

    Aufforderung
    wozu?
    Du konvertierst eine Fehler-Beschreibung (einen String) in eine Exception, ohne sie (mit Throw) zu werfen.
    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!