C++ dll in Visual Basic einbinden



  • Hallo,
    ich muss eine dll (erzeugt in C++) in Visual Basic einbinden und habe folgendes Problem...

    die Funktion, welche exportiert wird sieht so aus:

    DLL_API void calc(unsigned char *Buf, unsigned long ulBufLen, unsigned short &unCurr, unsigned long ulPos)
    

    mein Visual Basic Code sieht so aus:

    Private Declare Function calc Lib "CRC_dll.dll" Alias "?calc@@YAXPAEKAAGK@Z" () // was kommt in die Klammern???

    Mein Problem: Das was in in Klammern steht muss ja jetzt noch mit den Übergabe Parametern versehen werden, wenn es nur nen int oder nen long wäre ist es klar. Aber Pointer auf char??? was entspricht sowas in Visual Basic??

    Vielleicht ist ja hier jemand dabei, der sich auch in VB auskennt...



  • Private Declare Function calc Lib "CRC_dll.dll" Alias "?calc@@YAXPAEKAAGK@Z"

    vergiss es, das ist kein export mit dem VB etwas anfangen kann.

    Stattdessen:

    void __declspec(dllexport) calc(unsigned char *Buf, unsigned long ulBufLen, unsigned short &unCurr, unsigned long ulPos)
    

    und eine "CRC_dll.def"-Datei mit folgendem Inhalt:

    LIBRARY "CRC_dll.dll"
    
    EXPORTS
    calc @1
    

    In VB:

    Private Declare Function calc Lib "CRC_dll.dll" (Byref Buf as Byte, Byval ulBufLen as Long, Byval ulPos as Long)
    

    In VB übergibts du als "Buf" dann das erste Element eines Byte-Array (und somit, weil "Byref" die Adresse des Arrays).
    Da VB Longs eigentlich signed sind müsstet du in VB eventuell vorher ein Umwandlung signed auf unsigned auf Bitebene machen. Kann aber sein das es da ein implizite Konvertierung gibt.



  • Hi Danke,

    und was mache ich mit dem

    unsigned short &unCurr
    

    der wird als Reference übergeben - da könnte ich zur Not auch nen return daraus machen und die Referenz weglassen, aber was entspricht dem short in VB??

    void __declspec(dllexport) calc(unsigned char *Buf, unsigned long ulBufLen, unsigned short &unCurr, unsigned long ulPos)

    ich habe nen #define DLL_API __declspec(dllexport) drin gehabt...



  • unsigned short &unCurr
    sorry, übersehen.

    das wird in VB ein "Byref as Integer" als Parameter draus. Wieder die Problematik mit signed/unsigned.
    "Byref" ist in VB eine Übergabe als Referenz/Zeiger.

    #define DLL_API __declspec(dllexport)

    ich weis ja nicht wie das bei dir definiert ist. Normal kenn ichs nämlich als "DLLAPI" (ohne Unterstrich). Deswegen. 😉

    Das wichtige ist die *.def Datei. Nur dann kann VB as mit dem Export anfangen.



  • ok super danke .....
    das mit dem unsigned und signed - das ist genau mein problem.... ich habe eine crc berechnung in VB die wird dort aber falsch berechnet wegen des unsigned problems denke ich, aber in C++ richtig - jetzt versuche ich diese funktion aus c++ zu exportieren.... um die richtige Berechnung zweier applikationen in VB/C++ zu gewährleisten

    noch eine frage - sorry...

    in VB heisst die funktion

    Public Function calc( Buf() As Long, ByVal BufLen As Long, Optional ByVal bInteractive As Boolean = True) As Long

    der Buf() entspricht dem des unsigned char *Buf in C++ - kann ich denn einfach in die exportierte "dll-Funktion" ein Long Array aus VB "reinstecken"???



  • Also wenn die DLL ein " unsigned char* " ertwartet kannst du eigentlich nicht einfach ein VB-Long-Array übergeben. Ein Long hat doch 4 Byte.
    Möglicherweise klappt zwar der Aufruf, aber wie willst den long array so füllen, das er die richtigen Daten enthält? Macht doch keinen Sinn.
    Generell funktioniert die Übergabe von Arrays als Parameter anders. Du übergibts immer das erste Feld des Arrays als Referenz, was gleichbedeutend mit der Startdadresse des Arrays ist.
    Also so:

    ... Byref Buf as Byte ...
    

    Aufruf mit

    Dim Buffer() as Byte
    Call calc ( Buffer(0), .. )
    

    Nochwas:
    Also das ist ein CRC32 für VB der AFAIR korrekt arbeitet.

    Private CRCTable(0 To 255) As Long
    
    Public Function CalcCRC32(ByteArray() As Byte) As Long
    Dim Limit As Long
    Dim CRC As Long
    Dim Temp1 As Long
    Dim Temp2 As Long
    Dim i As Long
      Limit = UBound(ByteArray)
      CRC = -1
      For i = LBound(ByteArray) To Limit
        If CRC < 0 Then
          Temp1 = (((CRC And &H7FFFFFFF) \ 256) Or &H800000) And &HFFFFFF
          'Temp1 = Temp1 \ 256
          'Temp1 = (Temp1 Or &H800000) And &HFFFFFF
        Else
          Temp1 = (CRC \ 256) And &HFFFFFF
        End If
        Temp2 = ByteArray(i)   ' get the byte
        Temp2 = CRCTable((CRC Xor Temp2) And &HFF)
        CRC = Temp1 Xor Temp2
      Next i
      CRC = CRC Xor &HFFFFFFFF
      CalcCRC32 = CRC
    End Function
    
    Private Sub Class_Initialize()
    Dim i As Integer
    Dim J As Integer
    Dim Limit As Long
    Dim CRC As Long
    Dim Temp1 As Long
      Limit = &HEDB88320
      For i = 0 To 255
        CRC = i
        For J = 8 To 1 Step -1
          If CRC < 0 Then
            Temp1 = CRC And &H7FFFFFFF
            Temp1 = Temp1 \ 2
            Temp1 = Temp1 Or &H40000000
          Else
            Temp1 = CRC \ 2
          End If
          If CRC And 1 Then
            CRC = Temp1 Xor Limit
          Else
            CRC = Temp1
          End If
        Next J
        CRCTable(i) = CRC
      Next i
    End Sub
    


  • ich bins nochmal - also ich habs immer noch nicht geschafft meine dll ordentlich in VB einzubinden.

    habe ich eine Dll nur mit functionen ohne Übergabeparameter funzt alles ohne Probleme. erwarte ich nur ein Parameter dann funzt es nicht mehr.

    was mache ich falsch???

    code in der dll

    DLL_API int bla( std::string str );
    

    code in VB
    Private Declare Function bla Lib "bla.dll" (ByVal h As String) As Integer

    habe schon mit chars rumprobiert doch nie eine lösung bekommen....



  • ok - habe es jetzt endlich rausbekommen und nun funzt es wunder prächtig
    die dll Aufrufkonvention wird nicht beachtet
    Lösung:

    short __stdcall write( char* szFile )
    

    und nicht

    __declspec(dllexport) ...
    

Anmelden zum Antworten