| |
VB.NET - Ein- und UmsteigerEinbinden einer C-DLL | | | Autor: Klaus65 | Datum: 05.03.12 22:00 |
| Hallo,
ich versuche gerade eine DLL ein mein VB.NET Projekt einzubinden, habe aber keine Ahnung wie ich das machen soll.
Aus der DLL möchte ich die Funktion
ND2GetHostIP (const char* hostname, unsigned long* ip)
einbinden.
Parameter:
hostname Pointer auf einen C-String, der die IP-Adresse enthält
ip [Rückgabewert] Pointer auf eine Variable in der die IP-Adresse gespreichert ist (in Host Byte Order)
Wäre toll wenn mir jemand weiterhelfen könnte!!!
Klaus65 | |
Re: Einbinden einer C-DLL | | | Autor: raiserle | Datum: 06.03.12 09:08 |
| Hallo Klaus65,
hat die Funktion auch einen Rückgabewert?
[Ja / Bool]
Declare Function ND2GetHostIP Lib "deine.dll" ( ByVal hostname As String, ByRef ip As ULong ) As Boolean
[Nein]
Declare Sub ND2GetHostIP Lib "deine.dll" ( ByVal hostname As String, ByRef ip As ULong ) | |
Re: Einbinden einer C-DLL | | | Autor: Klaus65 | Datum: 06.03.12 09:34 |
| Hallo raiserle,
die Funktion gibt einen String zurück.
Ich habe es folgendermaßen probiert:
Imports System
Imports System.Runtime.InteropServices
Module Module1
<DllImport("ND2_DLL.DLL", CallingConvention:=CallingConvention.StdCall)> _
Function ND2GetHostIP(ByVal hostname As String, ByRef ip As ULong) As String
End Function
Sub Main()
Dim ip As ULong
Dim host As String
Dim antw As String
host = "192.168.001.111"
antw = ND2GetHostIP(host, ip)
End Sub
End Module
Dabei erhalte ich aber immer die Fehlermeldung:
"Die Typensignatur der Methode ist nicht PInvoke-kompatibel"
Was mache ich dabei falsch??? | |
Re: Einbinden einer C-DLL | | | Autor: Klaus65 | Datum: 06.03.12 10:10 |
| Hallo DaveS,
die Funktion gibt als String entweder eine Fehlermeldung zurück, oder ND2_NoError als Mitteilung, dass die Funktion erfolgreich ausgeführt wurde.
In der DLL geht es um die Ansteuerung eines Anzeigegrätes für ein Längenmessgerät. Sie entält noch weitere Funktionen zum Abruf der Messwerte, jedoch erhalte ich schon bei der ersten Funktion die oben beschriebene Fehlermeldung. | |
Re: Einbinden einer C-DLL | | | Autor: DaveS (Moderator) | Datum: 06.03.12 11:26 |
| Wie gesagt man sollte besser keine Strings als Ergebnis einer API Funktion zurückgeben, die Windows API zB tut das nicht (naja, selten). Es wird sonst immer ein Puffer und Länge als Parameters übergeben. P/Invoke muss den String von der Dll freigeben, sonst gäbe es einen Speicherleck. Die CLR soll angeblich deswegen immer CoTaskMemFree() verwenden, was durchaus zu Programmfehlern bzw Korruption des Heaps führen kann wenn CoTaskMemAlloc() nicht verwendet wurde um den Speicher zu allokieren. Soll ab FW 4.0 aber anders sein, nichts wirfd freigegeben. Eventuell erklärt das aber deine Fehlermeldung, da bin ich mir nicht sicher.
Du kannst sonst den Wert als IntPtr deklarieren, und Marshal.PtrToString() verwenden um den String zu kopieren und den Speicher dann selbst freigeben, wenn du weißt wie.
Deine ip Parameter sollte übrigens eventuell als UInteger (32 Bit) deklariert sein. Ips sind entweder 4 oder 16 Bytes.
________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist | |
Re: Einbinden einer C-DLL | | | Autor: raiserle | Datum: 06.03.12 11:35 |
| Es wäre hilfreich, die Doku der Funktion exakt zu posten.
Bsp.
ULong muss nicht gleich unsigned long sein. 8 bzw 4 Byte usw.
Aber sowas sollte in der Doku mit drin stehen. | |
Re: Einbinden einer C-DLL | | | Autor: raiserle | Datum: 06.03.12 12:27 |
| Ich bin jetzt nicht so bewandert in VB.Net - um dir zu sagen, wie man die LIB mit gegenlinkt.
Aber was auf jeden Fall ist return von deiner Funktion nicht STRING.
siehe: ND2.h -> typedef enum ND2_ERR
Aus diesem kannst du in VB folgendes machen.
Enum ND2_ERR
ND2_NoError = 0,
ND2_InvChannel = &h60000002, ' return von deiner funktion
ND2_NotInitialized = &h60000003,
'.....
ND2_HostNotFound = &hA0000002, ' bzw das
' usw...
End Enum /*! Resolves a host name (either as ASCII hostname, e.g. 'ND2.network.domain', 'ND2' or as
IP address string , e.g. '192.168.1.2) to an unsigned long in host byte order.
\param hostname contains either the ip-address or the hostname of the ND2 as a string
\param ip pointer to an unsigned long which receives the IP address
\return Some possible return codes are:
- ND2_NoError if the call returns successfully
*/
ND2_ERR ND2GetHostIP(const char *hostname, unsigned long *ip); | |
Re: Einbinden einer C-DLL | | | Autor: raiserle | Datum: 06.03.12 12:37 |
| Achtung Enum c&p Fehler. Dort sollten Keine Kommas sein ;)
Enum ND2_ERR
ND2_NoError = 0 ' return von deiner funktion
ND2_HostNotFound = &hA0000002 ' bzw das
End Enum
Declare Function ND2GetHostIP Lib "ND2_DLL.dll" ( ByVal hostname As String, _
ByRef ip As Int32) As ND2_Err Sry DaveS, ich hatte meinen Post.. vor deinem begonnen - nur war ich ne weile *ABGELENKT* | |
Re: Einbinden einer C-DLL | | | Autor: DaveS (Moderator) | Datum: 06.03.12 13:09 |
| Naja, ist kaum das einzige Problem, das man mit der API haben wird, vermute ich.
Public Enum ND2_ERR As UInteger
ND2_NoError = 0 ' Call was successful
ND2_InvChannel = &H60000002 ' invalid channel
ND2_NotInitialized = &H60000003 ' not initialised
ND2_AccNotAllowed = &H60000004 'access not allowed(e.g. Soft Realtime
' Mode enabled, EnDat master already in use, ...)
ND2_FuncNotSupp = &H6000000A ' function not supported
ND2_ParamInvalid = &H6000000C ' parameter not valid
ND2_TimerTrgEn = &H80000003UI ' Timer Trigger is enabled
ND2_ExtTrgEn = &H80000004UI ' External Trigger is enabled
ND2_NoCustNetwork = &H90000004UI ' no custom network parameter available
ND2_HostnameTooLong = &H90000008UI ' hostname is to long/short
ND2_HostnameInvalid = &H90000009UI ' hostname invalid
ND2_CantSaveHostn = &H9000000AUI ' can not save hostname
ND2_CantRdHostname = &H9000000CUI ' can not read hostname
ND2_DestIPUnreach = &H90000042UI ' destination IP for Soft Realtime
' Mode unreachable
ND2_SoftRTEn = &H90000044UI ' Soft Realtime Mode already enabled
ND2_CantTermConn = &H90000051UI ' can not terminate connection
ND2_CantTermSelf = &H90000052UI ' can not terminate myself
ND2_BroadcastInv = &H90000062UI ' use of broadcast address is not
' allowed
ND2_PortNoInv = &H90000063UI ' invalid port number
ND2_CantInitWinSock = &HA0000001UI ' WSAStartup() call failed on WIN32
ND2_HostNotFound = &HA0000002UI ' gethostbyname() could not resolve
' hostname
ND2_CantOpenSocket = &HA0000003UI ' the socket could not be created
ND2_CantConnect = &HA0000004UI ' could not connect the socket to the
' device
ND2_SendError = &HA0000005UI ' Error ocurred while sending data to the
' device
ND2_ReceiveError = &HA0000006UI ' Error ocurred while receiving data
' from the device
ND2_OutOfMemory = &HA0000007UI ' Required memory could not be allocated
ND2_IllegalParameter = &HA0000008UI ' The parameter is invalid for this
' command
ND2_InvalidResponse = &HA0000009UI ' The command response of the device
' is invalid
ND2_InvalidHandle = &HA000000AUI ' The handle passed to any ND2*
' function is invalid
ND2_ConnReset = &HA000000BUI ' The connection was reset by the peer
ND2_ConnTimeout = &HA000000CUI ' The network request has timed out
ND2_BufferTooSmall = &HA000000DUI ' The destination memory size is too
' small
ND2_CantStartThread = &HA000000EUI ' Cannot start the soft realtime
' thread
ND2_ElementSizeInv = &HA000000FUI ' FIFO element size mismatch
ND2_FIFOEmpty = &HA0000010UI ' The FIFO is empty, cannot retrieve
' element
ND2_FieldNotAvail = &HA0000011UI ' The data field requested is not
' available for the current connection
ND2_IFVersionInv = &HA0000012UI ' Invalid interface version
ND2_FIFOOverflow = &HA0000013UI ' The FIFO had an overflow, some data
' packets are lost
ND2_PortDirInv = &HA0000014UI ' The I/O port has the wrong direction
' for this operation
ND2_CantPreset = &HB0000001UI ' can not preset the counter
ND2_CantLockKeypad = &HB0000002UI ' can not lock keypad
ND2_CantReleaseKeypad = &HB0000003UI ' can not release keypad
ND2_CantStartMeasurement = &HB0000004UI ' can not start series of
' measurement or SPC
ND2_CantStoppMeasurement = &HB0000005UI ' can not stopp series of
' measurement or SPC
ND2_CantChangeREFstatus = &HB0000006UI ' can not change Reference status
ND2_KeyError = &HB0000007UI ' not allowed key or key commands too fast
ND2_NoErrorMessage = &HB0000008UI ' no error message available
ND2_CantChangeMod = &HB0000009UI ' can not change to requested mode
ND2_TmpCmpEn = &HB000000AUI ' Temp. compensation is enabled
ND2_NoData = &HB000000BUI ' no data available
ND2_InvParamList = &HB000000CUI ' invalid parameter list
ND2_InvCmpTable = &HB000000DUI ' invalid compensation table
End Enum ________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist | |
Re: Einbinden einer C-DLL | | | Autor: Klaus65 | Datum: 06.03.12 13:48 |
| Hallo,
ich habe es jetzt folgendermaßen probiert:
Enum ND2Err
ND2_NoError = 0 ' /*!< Call was successful */
ND2_InvChannel = &H60000002 ' /*!< invalid channel */
ND2_NotInitialized = &H60000003 ' /*!< not initialised */
ND2_AccNotAllowed = &H60000004 ' /*!< access not allowed(e.g. Soft Realtime Mode enabled,
End Enum
Module Module1
<DllImport("ND2_DLL.DLL", CallingConvention:=CallingConvention.StdCall)> _
Function ND2GetHostIP(ByVal hostname As String, ByRef ip As UInt32) As ND2Err
End Function
Sub Main()
Dim ip As UInt32
Dim host As String
'Dim antw As String
Dim Antw As ND2Err
host = "192.168.001.111"
antw = ND2GetHostIP(host, ip)
End Sub
End Module
Dabei habe ich jedoch wieder eine Fehlermeldung erhalten:
Ein Aufruf an die PInvoke-Funktion "ND2_VB2010!ND2_VB2010.Module1::ND2GetHostIP" hat das Gleichgewicht des Stapels gestört. Wahrscheinlich stimmt die verwaltete PInvoke-Signatur nicht mit der nicht verwalteten Zielsignatur überein. Überprüfen Sie, ob die Aufrufkonvention und die Parameter der PInvoke-Signatur mit der nicht verwalteten Zielsignatur übereinstimmen.
D.h. irgend etwas stimmt immer noch nicht. Allerdings bekomme ich bereits eine IP zurück
ip = 32235887
daher denke ich, dass ich schon sehr nahe am Ziel bin | |
Re: Einbinden einer C-DLL | | | Autor: Klaus65 | Datum: 06.03.12 15:06 |
| Hallo zusammen,
jetzt funktioniert es!
Vielen Dank, ihr habt mir sehr geholfen!! | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere Infos
|