Problem med att anropa C++ DLL från VB
Postat: 11 maj 2015, 20:58:39
På Win7 64bit försöker jag, från Visual Basic Express 2013, anropa funktioner i en "C++ dll".
Det finns exempelprojekt, som kompileras med Qt, och i det ser C++ funktionsdeklarationen ut som följer:
(där smbus är typedef'ad som long)
I exempelprojektet har jag sedan redigerat lite och för enkelhetens skull hårdkodat anropet till funktionen så att det ser ut så här:
Ovanstående fungerar, programmet ansluter till COM10, helt enligt plan. Detta visar att hårdvaran fungerar korrekt, RS485-adaptern hittas på COM10).
Nu över till Visual Basic.
Här har jag (försökt) översatta funktionsdeklarationen till:
Och själva anropet ser ut:
Men här fungerar det inte, funktionen returnerar -1 vilket ju betyder FAIL. "Normalt" sett så betyder ju det att det är en icke existerande COM-port, att den inte hittar RS485-adaptern (en FTDI variant) eller att porten redan är öppen. Men det fungerar fint att både öppna och stänga porten från exempelprojektet.
Jag har på liknande sätt lyckats "importera" och anropa tre andra funktioner i dll'en så jag känner att jag inte är helt ute och cyklar men här har jag kört fast. Vad exakt menas med const char * devicename i funktionsdeklarationen? Jag, som är urdålig på C, fattar det som att funktionen förväntar sig en pekare till en sträng vilket är anledningen till att jag i VB säger ByRef DeviceName as String - men det fungerar ju inte....jag har även provat ByVal in deklarationen men det hjälper inte.
Någon som har några idéer om vad jag gör för fel?
Det finns exempelprojekt, som kompileras med Qt, och i det ser C++ funktionsdeklarationen ut som följer:
Kod: Markera allt
// Open SM RS485 communication bus. Parameters:
// -devicename: "USB2VSD" or com port as "COMx" where x=1-16
// -return value: handle to be used with all other commands, -1 if fails
LIB smbus smOpenBus( const char * devicename );
I exempelprojektet har jag sedan redigerat lite och för enkelhetens skull hårdkodat anropet till funktionen så att det ser ut så här:
Kod: Markera allt
busHandle=smOpenBus("COM10")
Nu över till Visual Basic.
Här har jag (försökt) översatta funktionsdeklarationen till:
Kod: Markera allt
<DllImport("smv2.dll", EntryPoint:="smOpenBus", SetLastError:=True, CharSet:=CharSet.Unicode, ExactSpelling:=True, CallingConvention:=CallingConvention.Cdecl)>
Public Function smOpenBus(ByRef DeviceName As String()) As Int32
End Function
Kod: Markera allt
Dim busHandle As Int32 ' smOpenBus returnerar en "C++ LONG vilket är en Int32 i VB).
busHandle=smOpenBus("COM10")
Jag har på liknande sätt lyckats "importera" och anropa tre andra funktioner i dll'en så jag känner att jag inte är helt ute och cyklar men här har jag kört fast. Vad exakt menas med const char * devicename i funktionsdeklarationen? Jag, som är urdålig på C, fattar det som att funktionen förväntar sig en pekare till en sträng vilket är anledningen till att jag i VB säger ByRef DeviceName as String - men det fungerar ju inte....jag har även provat ByVal in deklarationen men det hjälper inte.
Någon som har några idéer om vad jag gör för fel?