Einzelnen Beitrag anzeigen

hhcm

Registriert seit: 12. Feb 2006
Ort: Wegberg
310 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: Swissbit DLL - Diverse Fragen

  Alt 18. Dez 2019, 17:57
Danke, das funktioniert.


Jetzt dachte ich, langsam hab ich die API komplett verstanden, jetzt häng ich schon wieder seit Stunden an den Transaktionen.
Eine Lognachricht wird in der TSE gespeichert, ich bekomme aber kein WormTransactionResponse hin.
Eigentlich habe ich soweit das C# Programm nachgeahmt - heißt - alles in Klassen verpackt.

Delphi-Quellcode:
function worm_transaction_response_new(context: IntPtr): IntPtr; cdecl; external 'WormAPI.dll';
procedure worm_transaction_response_free(const response_pointer: IntPtr); cdecl; external 'WormAPI.dll';
function worm_transaction_response_transactionNumber(const response_pointer: IntPtr): worm_uint; cdecl; external 'WormAPI.dll';
function worm_transaction_start(context: IntPtr; clientId: PAnsiChar; processData: PByte; processDataLength: worm_uint; processType: PAnsiChar; response: Pointer): Integer; cdecl; external 'WormAPI.dll';

type
  WormTransactionResponse = class
  private
    response_pointer: IntPtr;
  public
    constructor Create(worm_context: IntPtr);
    destructor Destroy; Override;
    function TransactionNumber: worm_uint;
  end;

implementation

constructor WormTransactionResponse.Create(worm_context: IntPtr);
begin
  response_pointer := worm_transaction_response_new(worm_context);
  // Hier bekomme ich eine Adresse.
end;

destructor WormTransactionResponse.Destroy;
begin
  worm_transaction_response_free(response_pointer);
  inherited;
end;

function WormTransactionResponse.TransactionNumber: worm_uint;
begin
  result := worm_transaction_response_transactionNumber(response_pointer);
end;

...

var
  res: Integer;
  Response: WormTransactionResponse;
  transId: worm_uint;
begin
  Response := WormTransactionResponse.Create(worm_context); // Hier ist Response scheinbar gültig
  // Mache ich hier Response.Free ist alles gut. Heisst ich habe eine gültige Adresse.
  try
    res := worm_transaction_start(worm_context, PAnsiChar(clientId), nil, 0, PAnsiChar(processType), @Response);
    // res ist 0 . Aber die Adresse von Response hat sich verändert

    if (res <> 0) then
      raise EWormException.Create(res);

    transId := Response.TransactionNumber; // Hier Krachts, da Response auf eine falsche Adresse zeigt.
  finally
     Response.Free;
  end;

end;
Hat da jemand eine Erklärung zu?
Chris
  Mit Zitat antworten Zitat