Neues Thema starten

Definition worm_transaction_listStartedTransactions falsch?

Hallo zusammen,

kann es sein, dass die Definition der Funktion falsch ist?

Die Definition ist laut API-Dokumentation


worm_transaction_listStartedTransactions(WormContext * context, const char * clientId, int toSkip, worm_uint * transactionNumbers, int transactionNumbersLength, int * storedTransactionNumbers)


mit


[in] context

[in] clientId

[in] toSkip

[out] transactionNumbers

[in] transactionNumbersLength

[out] storedTransactionNumbers


Wenn ich die Funktion in Delphi so wie in der Doku definiere, kommt nur ein Zugriffsfehler.

Allerdings bei

TWorm_transaction_listStartedTransactions = function(Context: IntPtr; const clientId: String; toSkip: Integer; transactionNumbers: array of Integer; out transactionNumbersLength: Integer; storedTransactionNumbers: array of Integer): Integer; stdcall;

läuft es richtig, WormError ist 0 und der transactionNumbersLength bringt mir die richtige Zahl der offenen Transaktionen, die auch in transactionNumbers richtig ausgegeben werden.

Also müsste der Parameter transactionNumbersLength ja mit OUT gekennzeichnet sein.

Ich verwende die neueste DLL version.


Weiß da jemand was? Kann mir das jemand bestätigen?


Hans


1 Person hat diese Frage

Und noch was:

wofür der Parameter "storedTransactionNumbers" sein soll, sehe ich nicht. Mit dem Passiert rein gar nichts, obwohl die Funktion fehlerfrei läuft.

Moin,


die Definition und auch die Dokumentation sind korrekt. Der letzte Parameter ist kein Array, sondern ein Zeiger auf einen Int32-Wert. Aus der Doku:


@param[out] storedTransactionNumbers The amount of elements that were stored

    in @p transactionNumbers. Might be less than @p transactionNumbersLength

    if there are not enough started transactions.


Folgende Definition funktioniert:

 

type
  WormContext = NativeUInt;
  PWormContext = ^WormContext;
  worm_uint = uint64;
  worm_puint = ^worm_uint;
  WormError = word;
//...
function worm_transaction_listStartedTransactions(
    context : PWormContext; const clientId : PBytes; toSkip : int32;
    transactionNumbers : worm_puint; transactionNumbersLength : int32;
    storedTransactionNumbers : PInt32) : WormError; cdecl;



 

Hallo Daniel,

vielen Dank. Dass Du die Clients als PBytes definierst, hat mir bei worm-tse-listRegisteredClients schon mal geholfen (ich habe die jetzt programmweit als TBytes definiert und schon läufts).

Die listStartedTransactions nehme ich mir jetzt wieder vor und melde mich zurück.

Siehe https://support.gastro-mis.de/support/discussions/topics/36000015196

Hallo Daniel,

ich hab mir den PInt32 als ^Int32 definiert.

Jetzt bekomme ich was raus, aber was soll das sein? Es kommt sowas raus: -1073740920,  selten auch ein Positiver Wert von 1073746824, immer dasselbe, egal wieviele Transaktionen ich hinzugefügt habe.


Es ist zumindest egal, ob ich stdcall oder Windows32 benutze, die beiden Werte sind immer die gleichen.


Wenn einmal der positive Wert kommt, ist es bei der nächsten Abfrage wieder der negative.


Ich bin momentan EOF :-)


Hans

Hallo zusammen,


noch ein Problem bei den Transactions:

Die Funktion 

procedure worm_transaction_response_serialNumber(const response: IntPtr; out serialNumber: TBytes; out serialNumberLength: UInt64/UInt32); cdecl; external 'WormAPI.dll';

bringt eine Zugriffverletzung, aber nur bei der Transaktionsnummer 1 (also der zweiten). Dies auch nur bei den dll-Versionen stdcall und Windows32, Windows64 arbeitet ohne Fehler. Meine Kasse ist aber 32bit und diese Zugriffverletzung lässt sich nicht abfangen.


Das Ergebnis der response_serialNumber stimmt, hier der gesamte response der Transaktion 1:


neu: 1: 17.04.2019 16:19:29

Seriennummer der TSE: 89-0E-2E-44-87-1D-1B-C5-C7-7F-47-E6-C2-6E-25-D3-30-90-F4-DD-67-D9-84-10-C6-7E-CE-08-77-83-BD-0C

Signaturzähler der Transaktion: 3639

Signatur der Transaktion:

02E4176F4B6DE62D5AADA28E8219843184B3492C3B244F704155C0A67A93A266DA1E75FDD90296BB53DD0CB1219CA72871329B9E432DC025F4AA40FC4BA2BCAB5FDB8763DB16D100558EDCB54661A0F5FD42D188408DAB2346914ACBC808520A


Alle anderen response Abfragen arbeiten fehlerlos, sogar die worm_transaction_response_signature, die ja die gleiche Syntax hat.


Kann mir da irgendwer von Euch weiterhelfen?


Vielen Dank

Hans

Hallo Daniel,

wenn ich hier im Forum so lese, glaube ich manchmal, dass jeder hier ein Delphi von seinem eigenen Stern hat :). Ich arbeite mit 10.3.

Die Funktionsdefinition, die jetzt stabil mit jeder DLL läuft ist:  

function worm_transaction_listStartedTransactions(Context: PIntPtr; const clientId: PAnsiChar; toSkip: Int32; out transactionNumbers: array of UInt64; out transactionNumbersLength: Int32; out storedTransactionNumbers: PInt32): WormError; cdecl; external 'WormAPI.dll';

Der Abruf läuft so:

procedure TForm2.getTRsButtonClick(Sender: TObject);
var
  transactionNumbersLength, i: Int32;
  storedTransactionNumbers: PInt32;
  WE: WormError;
  {$IFDEF stdcall}
  AAI: array of UInt32;
  {$ELSE}
  AAI: array of UInt64;
  {$ENDIF}
begin
  WormTransactionStarted := True;
  try
    MemoNTR.Lines.Clear;
    repeat
      Application.ProcessMessages;
    until not WormTimeSyncThreadWorking;
    Setlength(AAI, 62);
    try
      WE := worm_transaction_listStartedTransactions(PWormContext, PWormClientId, 0, AAI, transactionNumbersLength, storedTransactionNumbers);
      if WE = WORM_ERROR_NOERROR then
      begin
        MemoNTR.Lines.Add('Transaktionen erfolgreich gelesen');
        if transactionNumbersLength > 0 then
          MemoNTR.Lines.Add('transactionNumbersLength: ' + IntToStr(transactionNumbersLength){ + ' offene Transaktionen:'})
        else
          MemoNTR.Lines.Add('keine offenen Transaktionen gefunden');
        for i := 0 to transactionNumbersLength - 1 do
          MemoNTR.Lines.Add('Transaktionsnummer ' + IntToStr(AAI[i]));
        if storedTransactionNumbers <> nil then
          MemoNTR.Lines.Add('storedTransactionNumbers: ' + IntToStr(Int32(storedTransactionNumbers)))
        else
          MemoNTR.Lines.Add('storedTransactionNumbers: NIL')
      end else
        MemoNTR.Lines.Add('Fehler ' + writeWormError(WE) + ': Offene Transaktionen konnten nicht gelesen werden');
    finally
      Setlength(AAI, 0);
    end;
  finally
    WormTransactionStarted := False;
  end;
end;

Das Ergebnis ist korrekt bis auf die storedTransactionNumbers:

Transaktionen erfolgreich gelesen
transactionNumbersLength: 5
Transaktionsnummer 0
Transaktionsnummer 1
Transaktionsnummer 2
Transaktionsnummer 4
Transaktionsnummer 5
storedTransactionNumbers: NIL

Ich hatte zwar schon eine Konstellation, bei der die storedTransactionNumbers die Anzahl der offenen Transaktionen und die transactionNumbersLength die gesamte Anzahl an Transaktionen lieferte (also eigentlich auch verkehrt herum, und das auch nur nach einem vorhergehenden transaction_start), dafür war dann  transactionNumbers NIL, und zwar immer dann, wenn diese wie bei Dir als Pointer to UInt.. definiert waren. Und die sind ja der Zweck der Übung.

Nur mit einem array für die transactionNumbers habe ich auch die offenen rausbekommen, dafür ist  storedTransactionNumbers NIL.


Vielleicht kommt ja mal jemand drauf, was hier los ist und posted das auch.


Grüße

Hans

Hallo zusammen,


hat jemand schon eine Lösung?

 

Hier ist mein Quellcode und ich bekomme nur immer die Meldung     offene Transaktionsnummer = 0.

Wenn ich den Client aber deRegistrieren möchte, sagt er mir offene Transaktionen vorhanden.

procedure Tglb_TSE.Btn_TransFreeClick(Sender: TObject);
    var
      i, j, k                   : Integer;
      var_skip_int              : Integer;
      ptransactionNumbers       : array of UInt64;
      pstoredTransactionNumbers : PInt;
      transactionNumbersLength  : Integer = 0;

    begin
      var_Laufwerk_str     := Field_Laufwerk.Text;
      var_Lizenz_ID_str    := Field_Lizenznr.Text;
      var_Kassenanzahl_str := Field_Kassenanzahl.Text;
      i := 1;
      j := 0;
      var_skip_int := 0;

        Setlength(ptransactionNumbers, 62);

      GetMem(pstoredTransactionNumbers, 1000);

      for i := 1 to StrToInt(var_Kassenanzahl_str) do
      begin
             try

               TSE_Error := TSE_worm_transaction_listStartedTransactions(pContext, PChar(TSE_Client_ID), var_skip_int, ptransactionNumbers, transactionNumbersLength, pstoredTransactionNumbers);

               if (TSE_Error = WORM_ERROR_NOERROR) then
                  begin
                    Memo.Lines.Add('Transaktionen erfolgreich gelesen');
                    if transactionNumbersLength > 0 then
                       Memo.Lines.Add('transactionNumbersLength: ' + IntToStr(transactionNumbersLength){ + ' offene Transaktionen:'})
                    else
                       Memo.Lines.Add('keine offenen Transaktionen gefunden');

                    for j := 0 to transactionNumbersLength - 1 do
                        Memo.Lines.Add('Transaktionsnummer ' + IntToStr(ptransactionNumbers[j]));
                    if pstoredTransactionNumbers <> nil then
                       Memo.Lines.Add('storedTransactionNumbers: ' + IntToStr(pstoredTransactionNumbers^))
                    else
                       Memo.Lines.Add('storedTransactionNumbers: NIL')
                  end
               else
                  Memo.Lines.Add('Fehler ' + PChar(IntToStr(Qword(Ord(TSE_Error)))) + ': Offene Transaktionen konnten nicht gelesen werden');
               

             finally
                Memo.Lines.Add('');
             end;
      end;

    end;

 

 

Oder weiß vielleicht jemand wo hier der Fehler ist?

 

Danke

Anmelden oder Registrieren um einen Kommentar zu veröffentlichen