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ährleistennoch 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 Integerhabe 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) ...