C/C++ Lib richtig einbinden

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von Wulf.

    C/C++ Lib richtig einbinden

    Hallo,

    ich stehe im Moment vor dem Problem, das ich nicht genau weis wie ich die Funktionen einer Bibliothek eines PT100 datenloggers richtig in VB einbinde. Hier mal zwei der Funktionen um die es geht:
    Funktionen

    Quellcode

    1. PICO_STATUS UsbPt104Enumerate (
    2. char * details,
    3. unsigned long * length,
    4. COMMUNICATION_TYPE type
    5. )

    Arguments: details, a string buffer to receive a maximum of length characters
    length, input: the length of the string buffer
    output: the length of the information string returned
    type, the communication type used by the PT-104. Can be any of
    the following enumerated types:
    CT_USB = 0x00000001
    CT_ETHERNET = 0x00000002
    CT_ALL = 0xFFFFFFFF
    Returns: defined in picoStatus.h (typedef unsigned long PICO_STATUS; )

    Quellcode

    1. PICO_STATUS UsbPt104GetUnitInfo (
    2. short handle,
    3. char * string,
    4. short stringLength,
    5. short * requiredSize,
    6. PICO_INFO info
    7. )

    Arguments: handle, identifies the device whose information is required
    string, output: the information requested
    stringLength, input: the length of the string buffer
    requiredSize, output: the length of the information string
    requested. If this is longer than stringLength then only the first
    stringLength characters of the requested information are written to
    string.
    info, the type of information required. The following types are
    defined in picoStatus.h:
    PICO_DRIVER_VERSION
    PICO_USB_VERSION
    PICO_HARDWARE_VERSION
    PICO_VARIANT_INFO
    PICO_BATCH_AND_SERIAL
    PICO_CAL_DATE
    PICO_KERNEL_DRIVER_VERSION
    Returns: defined in picoStatus.h


    Hier mal die erste Funktion grob in C# übersetzt (1 zu 1). Wollte es erstmal grob in C# übersetzen um es dann leichter in VB überstetzen zu können.

    Quellcode

    1. [DllImport("USBPT104.dll")]
    2. private static extern ulong UsbPt104Enumerate(char * details,
    3. ulong * length,
    4. enCommunicationType type);


    Was mir beim Übersetzen Probleme bereitet sind die Pointer. Währe super wenn ihr mir sagen könntet wie ich diese Richtig nach C#/VB übersetzen muss um später keine Probleme zu bekommen.

    Grüße Wulf

    Wulf schrieb:

    Hier mal die erste Funktion grob in C# übersetzt (1 zu 1).
    Gib lieber die C++-Deklaration an.
    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!
    PICO_STATUS UsbPt104Enumerate (char * details, unsigned long * length, COMMUNICATION_TYPE type);
    Mit Pointern ist das so eine Sache, das kann ich Dir ohne die DLL zum testen zu haben nicht aus der Hüfte übersetzen.
    PICO_STATUS ist nicht deklariert, ich würde es als Integer annehmen wollen; COMMUNICATION_TYPE ist ein enum, wird ebenfalls als Integer behandelt.
    ----
    unsigned long ist ebenfalls ein Integer, nur steht hier die Frage, ob ein Wert zurückkommt oder ob ein vorgegebenes Array befüllt wird.
    Das heißt ByRef length As Integer
    oder

    VB.NET-Quellcode

    1. ByVal length As IntPtr
    2. Dim p1 As IntPtr = Marshal.AllocHGlobal(4)
    3. ' p1 als Argument übergeben
    4. UsbPt104Enumerate(..., p1, ...)
    5. length = Marshal.ReadInt32(p1)
    6. Marshal.FreeHGlobal(p1)
    -----
    char* details würde ich zunächst mit <MarshalAs(UnmanagedType.LPStr)> details As String übersetzen.
    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!
    Erstmal danke für die Hilfe,

    Das mit der DLL ist so ne Sach, Ich weis nicht ob ich die so einfach hochladen darf, bzw. ob sie überhaupt ohne die Treiber und das Gerät funktioniert. Aber falls du dir die Mühe machen willst kannst du sie dir Herunterladen: picotech.com/software.html Musst dann zuerst den PT104 datenlogger (USB/Ethernet) auswählen und dann die SDK auswählen.

    btw: PICO_STATUS ist so:

    Quellcode

    1. typedef unsigned long PICO_STATUS;
    deklariert.

    Grüße Wulf

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Wulf“ ()

    Wulf schrieb:

    Aber falls du dir die Mühe machen willst kannst du sie dir Herunterladen
    Ich denke eher nicht.
    Sorry. :S
    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!
    Konkrete Fragen werde ich Dir natürlich konkret beantworten, keine Frage. Nur Fremdsoftware auf meinem Rechner installieren - das ist nicht mein Ding. :D
    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 bin ja auch Dumm^^ hab grade gesehen das es eine beispiel EXEL datei gibt mit VBA code werde jetzt mal diese Deklerationen verwenden:

    Quellcode

    1. Declare Function UsbPt104OpenUnit Lib "C:\CVSROOT\PICO\EXAMPLES\USBPT104\Excel\UsbPT104.dll" (ByRef handle As Integer, ByVal serial As Long) As Long
    2. Declare Function UsbPt104CloseUnit Lib "C:\CVSROOT\PICO\EXAMPLES\USBPT104\Excel\UsbPT104.dll" (ByVal handle As Integer) As Long
    3. Declare Function UsbPt104GetUnitInfo Lib "C:\CVSROOT\PICO\EXAMPLES\USBPT104\Excel\UsbPT104.dll" (ByVal handle As Integer, ByVal str As String, ByVal stringLength As Integer, ByRef requiredSize As Integer, ByVal info As Long) As Long
    4. Declare Function UsbPt104SetChannel Lib "C:\CVSROOT\PICO\EXAMPLES\USBPT104\Excel\UsbPT104.dll" (ByVal handle As Integer, ByVal channel As Long, ByVal measurementType As Long, ByVal noOfWires As Integer) As Long
    5. Declare Function UsbPt104GetValue Lib "C:\CVSROOT\PICO\EXAMPLES\USBPT104\Excel\UsbPT104.dll" (ByVal handle As Integer, ByVal channel As Long, ByRef value As Long, ByVal filtered As Integer) As Long
    Das sind VB6-Deklarationen, mach aus Long => Integer.
    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!