Libnodave mit VB2005

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe ein Problem mit daveReadManyBytes. Beim Versuch, mit dieser Funktion den DB1 auszulesen, kommt es zu einem Fehler.
Benutze ich daveReadBytes, dann klappt das, wenn z.B. nur 100 Bytes gelesen werden. Ich habe in einem Forums-Beitrag aus dem Jahr 2005 gelesen, dass die Funktion fälschlicherweise mal mit "daveManyReadBytes" bezeichnet wurde. So war es auch in meinem Modul. Deshalb habe ich sie in daveReadManyBytes umbenannt. Das nützt aber auch nichts. Nur die Fehlermeldung ändert sich.

Diese Aufruf erzeugt den Fehler:
Code:
res = daveReadManyBytes(dc, daveDB, 1, 0, 100, Buffer(0))
Dazu gehört die Funktionsdeklaration:
Code:
[COLOR=#0000ff]Public[/COLOR] [COLOR=#0000ff]Declare[/COLOR] [COLOR=#0000ff]Function[/COLOR] daveReadManyBytes [COLOR=#0000ff]Lib[/COLOR] [COLOR=#800000]"libnodave.dll"[/COLOR] ([COLOR=#0000ff]ByVal[/COLOR] dc [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] area [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] areaNumber [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] start [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] numBytes [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByRef[/COLOR] buffer [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR]) [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR]

Ich lese aus dem DB1 die ersten 100 Bytes. Die Deklaration für den Buffer lautet: Dim Buffer(9999) as Byte.


Gruß
Earny
 
probier es mal damit

Code:
res = daveReadManyBytes(dc, daveDB, 1, 0, 100, Buffer)
und in der Deklaration damit

Code:
[COLOR=#0000ff]Public[/COLOR] [COLOR=#0000ff]Declare[/COLOR] [COLOR=#0000ff]Function[/COLOR] daveReadManyBytes [COLOR=#0000ff]Lib[/COLOR] [COLOR=#800000]"libnodave.dll"[/COLOR] ([COLOR=#0000ff]ByVal[/COLOR] dc [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] area [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] areaNumber [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] start [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByVal[/COLOR] numBytes [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR], [COLOR=#0000ff]ByRef[/COLOR] buffer() [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]byte[/COLOR]) [COLOR=#0000ff]As[/COLOR] [COLOR=#0000ff]Integer[/COLOR]

wobei ich mir jetzt nicht sicher bin, ob nicht auch deine Deklaration "ByVal dc As Integer" falsch sein könnte.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo MW,

ich habe den Fehler dank Deiner Hilfe gefunden. In der Deklaration muss es beim letzten Parameter lauten "ByRef Buffer as Byte". Ich hatte da "ByRef Buffer as Integer" stehen. Jetzt funktioniert das.

Ich hätte da nochmal eine grundsätzliche Frage zur Wrapper-dll (libnodave.net.dll). Ich arbeite mit VB2005 (gehört ja auch zur VB.Net-Gruppe) und verzichte jetzt ganz auf den Wrapper. Ich weiß ehrlich gesagt nicht, wozu der überhaupt gut sein soll. Ich will nicht undankbar erscheinen und nochmal betonen, dass ich libnodave schon als tolles Werkzeug ansehe, um beispielsweise aus einer Hochsprache heraus kostenlos auf eine S7 zugreifen zu können. Oder bringt der Wrapper noch Vorteile mit sich, die ich noch nicht entdeckt habe?
Wenn ich auf den Wrapper verzichte, spreche ich die Konstanten, Prozeduren und Funktionen von libnodave in einem Modul oder in einer Klasse an, und das funktioniert problemlos (von Anfängerproblemen abgesehen). Ich muss nur den alten Modul12 nehmen und den Datentyp long (= 32-Bit-Integer bei VB6.0) umstellen auf Integer (= 32-Bit-Integer bei VB.Net) und sonst noch ein paar kleine Änderungen vornehmen. Ich habe aber jederzeit den Überblick, welche Konstanten, Prozeduren und Funktionen libnodave zur Verfügung stellt.


Gruß
Earny
 
Zurück
Oben