vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Zippen wie die Profis!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Einbinden einer C-DLL 
Autor: ModeratorDaveS (Moderator)
Datum: 06.03.12 12:06

Also die Function liefert einen Wert vom Typ ND2_ERR, das ist ein UInteger 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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Einbinden 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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 )
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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???
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einbinden einer C-DLL 
Autor: ModeratorDaveS (Moderator)
Datum: 06.03.12 09:48

Sowas sollte man nicht machen. Was passiert mit dem Speicher, was von der Methode zurückgegeben wird? Und als gute Praxis gilt, eine Funktion sollte sein Ergebnis als Rückgabewert liefern, nicht mittels Referenz. Außerdem kannst du mit der IPAddress-Klasse die Adressen parsen, umwandeln mit .HostToNetworkOrder() usw. Aber was wird denn als String zurückgegeben? Diesen Wert hast du am Anfang gar nicht erwähnt.

________
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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einbinden einer C-DLL 
Autor: ModeratorDaveS (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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einbinden einer C-DLL 
Autor: Klaus65
Datum: 06.03.12 11:56

Hallo raiserle,
die DLL incl. der gesamten Doku findest du hier

http://content.heidenhain.de/filebase/files/9333/73034802.zip
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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);
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einbinden einer C-DLL 
Autor: ModeratorDaveS (Moderator)
Datum: 06.03.12 12:31

Ja, habe ich schon gesagt. Und ein C(++) (U)Long ist (U)Integer in .Net, wie ich auch schon angedeutet habe.

________
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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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*
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einbinden einer C-DLL 
Autor: ModeratorDaveS (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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Einbinden einer C-DLL 
Autor: ModeratorDaveS (Moderator)
Datum: 06.03.12 14:49

< DllImport("ND2_DLL.DLL", CharSet:=CharSet.Ansi, _
  CallingConvention:=CallingConvention.Cdecl)>

________
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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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!!
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel