Neues Thema starten

VB.NET worm_transaction_listStartedTransactions

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?


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?


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.

Dann muss meine Definition von worm_uint falsch sein.
Wie sieht die in C# aus?

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.

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




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.


Versuchen Sie die Daten so zu übergeben:


result = worm_transaction_listStartedTransactions(Worm_context, "", 0, mTANumbers(1), mTAs, mTANumberCount)



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.


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

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

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.

@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.


Anmelden oder Registrieren um einen Kommentar zu veröffentlichen