@Maximilian Grießer: Ja, egal ob UInt64 oder UInt64(): das Ergebnis ist gleich.
Ja, irgendwo hängt es am Pointer auf das erste Array-Element. Ich bekomme genau nur dieses erste Element zurück.
@Stefan Happ: ich habe gestern die API 5.7 bekommen; werde nachher mal da schauen
Letztendlich habe ich das Problem gelöst, auch wenn mir der Weg umständlich erscheint.
Ich danke allen Helfern.
Ich glaube beim 4rten Parameter passiert bei beiden Varianten das gleiche. Ob ByRef Uint64 oder ByVal Uint64() sollte gleich sein, da ein Array in C nur der Pointer auf das erste Element ist. Und ich schätze .NET so intelligent ein, dass das direkt so umgewandelt wird :)
Beim Letzten Parameter sehe ich das ähnlich, es müsste nur ein Integer per Referenz übergeben werden.
Hier noch der DLL Import. API 5.5
Der letzte Param: Du verwendest einen Pointer, ich ein Integer
Der vierte Param: Du verwendets einen einfachen Wert, ich ein Array von UInt64
Irgendwo da wird es haken.
<DllImport("WormAPI.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)>
Private Shared Function worm_transaction_listStartedTransactions(ByVal wormcontext As IntPtr, ByVal ClientID As String, ByVal toSkip As Integer,
ByVal ArrayOfTransactions As UInt64(),
ByVal ArrayOfTransactionsBound As Integer,
ByRef ArrayOfTransactionsAnzahl As Integer) As Integer
End Function
So bei mir
Public Function ListStartedTransactions(ByVal Client As String, ByRef lResult As Integer, ByRef al As ArrayList) As Integer
Dim Anzahl As UInteger
'Das Info ist eine Instanz des WormInfos
Dim myArray As UInt64() = New UInt64(Info.MaxStartedTransactions - 1) {}
Dim result As UInteger
result = worm_transaction_listStartedTransactions(worm_context, Client, 0, myArray, Info.MaxStartedTransactions, Anzahl)
For Each u As UInt64 In myArray
al.Add(u)
Next
lResult = Anzahl
Return result
End Function
Hoffe es hilft, Stefan
Guten Morgen,
vielen, vielen Dank für Ihre Mühe rundum meine Fragen. Einige Denkanstöße haben weitergeholfen!!
Ich bin Ihrem Vorschlag gefolgt und bekommen ein ähnliches Ergebnis. Dann steht im Index 1 des Arrays die erste offen Transaktionsnummer.
Aber die Gesamtanzahl wird falsch, nämlich nur mit 1 angezeigt.
Ich nutze derzeit meine Lösung mit den Array-Grenzen von 62, weil da die Gesamtzahl korrekt zurückkommt. Und mit jedem Skip-Wert +1 bekomme ich die nächste offene Transaktions-Nummer im Index-Feld 62.
Funktioniert, entspricht aber nicht dem, was in der Dokumentation beschreiben wird.
Versuchen Sie die Daten so zu übergeben:
result = worm_transaction_listStartedTransactions(Worm_context, "", 0, mTANumbers(1), mTAs, mTANumberCount)
Update meinerseits:
Ich bin ein Stück weitergekommen, aber eben noch nicht am Ziel
<DllImport("WormAPI.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> Public Function worm_transaction_listStartedTransactions(ByVal context As IntPtr, ByVal clientId As String, ByVal toSkip As Integer, ByRef TANumbers As UInt64, _ ByVal TANumberLen As UInt32, ByRef TANumberAnzahl As IntPtr) As Integer End Function
Dim mTas As UInt32 = 62 Dim mTANumbers(mTas) As UInt64 Dim mTANumberCount As IntPtr result = worm_transaction_listStartedTransactions(Worm_context, "", 0, mTANumbers(mTAs), mTAs, mTANumberCount) If result <> 0 Then Throw New Exception(cMe & cMe2 & " Rückgabewert beim Lesen der Liste von Offenen Transaktionen : " & result)
liefert mir die korrekte Anzahl offener Transaktionen zurück
aber die erste Transaktionsnummer liegt in der Feld-Position 62, alles davor hat den Wert 0
und die fehlenden 17 Nummern sind nicht sichtbar.
Guten Morgen.
bezüglich worm_UInt stimmt dann meine Definition mit Uint64.
Dann wird es wohl der Zugriff auf das Array sein, was den Fehler auslöst:
System.AccessViolationException wurde nicht behandelt.
Message: Ein Ausnahmefehler des Typs "System.AccessViolationException" ist in System.Windows.Forms.dll aufgetreten.
Zusätzliche Informationen: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
Hier mein Ansatz:
Definition:
<DllImport("WormAPI.dll", CallingConvention:=CallingConvention.Cdecl, CharSet:=CharSet.Ansi)> Public Function worm_transaction_listStartedTransactions(ByVal context As IntPtr, ByVal clientId As String, ByVal toSkip As Integer, ByRef TANumbers() As UInt64, _ ByVal TANumberLen As UInt32, ByRef TANumberAnzahl As IntPtr) As Integer End Function
Umsetzung:
Dim result As Integer Dim mTANumbers(62) As UInt64 Dim mTANumberCount As IntPtr = IntPtr.Zero result = worm_transaction_listStartedTransactions(Worm_context, "", 0, mTANumbers, 62, mTANumberCount) If result <> 0 Then Throw New Exception(cMe & cMe2 & " Rückgabewert beim Lesen der Liste von Offenen Transaktionen : " & result)
gleicher Fehler, wenn
Dim mTANumbers() As UInt64 und / oder TANumberLen variabel ist
worm_uint hat nichts mit der Sprache zu tun, sondern mit der DLL, welche verwendet wird.
StdCall = 32 Bit
Andere = 64 Bit
Steht so auch in der Header-Datei:
#if WormAPI_STDCALL #define WORMAPI_CALL __stdcall typedef uint32_t worm_uint; #else #define WORMAPI_CALL /** Maximum size of an unsigned integer that this library can process. */ typedef uint64_t worm_uint; #endif
Können Sie auch Ihren Ansatz posten. Vielleicht haben Sie etwas anderes übersehen.
Dann muss meine Definition von worm_uint falsch sein.
Wie sieht die in C# aus?
Hallo,
eine Lösung für VB.NET habe ich nicht, aber für C#:
[DllImport("WormAPI.dll", CallingConvention = Calling)] public static extern int worm_transaction_listStartedTransactions(IntPtr wormContext, string clientId, int toSkip, worm_uint[] transactionNumbers, int transactionNumbersLength, out int storedTransactionNumbers); //Aufruf könnte so aussehen: var transactionNumbers = new worm_uint[MaxTransactions]; var err = worm_transaction_listStartedTransactions(tse.GetPointer(), clientId, 0, transactionNumbers, MaxTransactions, out var storedTransactionNumbers);
Ich glaube das komplizierte daran ist, dass man den Array schon vorher selber allokieren muss. Dieser wird dann von der WormAPI gefüllt.
Ich bin ein Stück weitergekommen und kann die Anzahl der offenen Transaktionen auslesen.
Aber die Ermittlung der Nummern zu den offenen Transaktionen ist noch nicht gelöst. Hier sind alle Felder mit Wert 0 gefüllt.
Gibt es niemanden mit einer Lösung in VB.NET?
GSchlag
Hallo an alle Mitleser/innen,
hat irgendwer es geschafft, die Liste der offenen Transaktionen im VB.NET zu ermitteln?
Alle meine Versuche anhand eines C++ oder eines Delphi-Beispiels scheitern im VB mit Fehler 1 = ungültiger Aufruf-Parameter.
Kann jemand helfen?