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?