Prośba o pomoc c++ vs Delphi

0

proszę o pomoc w takiej sprawie :
mam deklarację

POSBRIDGE_API PB_FN_RES WINAPI Initialization(
	LPCTSTR storage_path,
	LPCTSTR connection_params,
	LPCTSTR tid,
	FnAppsProcessInfo* ProccessInfoCallback = NULL,
	UINT transmission_timeout = 30,
	BOOL loging_to_file	= FALSE,
	UINT report_data_cleaning_depth = 7);

PB_FN_RES - to typ wyliczeniowy

w delphi zrobiłem tak :

function PInitialization(storage_path:PAnsiChar;
                             connection_params:PAnsiChar;
                             tid:PAnsiChar;
                             ProccessInfoCallback:PeFnAppsProcessInfo;
                             transmission_timeout:UINT;
                             loging_to_file:BOOL;
                             report_data_cleaning_depth:UINT):PB_FN_RES;cdecl external 'Brige.dll' name 'Initialization';

ale jakoś nie chce nawet znaleźć tej funkcji w dll
Może coś jest źle w tym wywołaniu w delphi ?? Proszę o pomoc.

0

Funkcje WinAPI z nielicznymi wyjątkami nie są cdecl tylko stdcall.
Makro WINAPI oznacza właśnie stdcall.

0

próbowałem i dalej niestety nie działa.
Nie znajduje tej funkcji w dll.

0

@TestowyAPI: no to albo nie działa, albo nie znajduje – to są dwie różne rzeczy.

function PInitialization(
  storage_path: PAnsiChar;
  connection_params: PAnsiChar;
  tid: PAnsiChar;
  ProccessInfoCallback: PeFnAppsProcessInfo = nil;
  transmission_timeout: UINT = 30;
  loging_to_file: BOOL = False;
  report_data_cleaning_depth: UINT = 7;
): PB_FN_RES; stdcall external 'bridge.dll' name 'Initialization';

Poza tym według dokumentacji typ danych LPCTSTR może być równoznaczny z LPCWSTR lub z LPCSTR w zależności od symbolu UNICODE, więc ciągi znaków równie dobrze mogą być unikodowe i wtedy zamiast używać PAnsiChar trzeba będzie użyć PWideChar.

0

racja, dwie róże sprawy - dostaję komunikat, że nie znajduje takiej funkcji w DLL
Nie mam pojęcia jak to sprawdzić :(
W dokumentacji mam napisane że tak właśnie ta funkcja się nazywa i taką ma definicję.
Myślałem, że może sam sposób definicji w delphi w powoduje, że nie może jej znaleźć. :(:(

0

@TestowyAPI: posiadasz plik nagłówkowy do tej biblioteki? Btw. to nie jest jakaś biblioteka od terminala płatności elektronicznych?

0

dokładnie tak, chodzi o terminal płatniczy
mam plik nagłówkowy, coś konkretnego z niego podać ??

1

no to po kolei, najpierw użyj programu TDump z folderu bin Delphi (składnia TDump.exe nazwabliblioteki.dll). Program w oknie dosowym poda ci nazwy nagłówków w bibliotece dll. O dziwo są inne niż w c++.
Następnie użyj HeadConv (jest to hiper stare narzędzie które po podaniu pliku nagłowowego nazwabiblioteki.h stworzy ci plik pas), program pobierzesz z tego miejsca http://www.drbob42.com/headconv/ .
Od tego momentu możesz brać się do roboty.

A tak z ciekawości - Polskie ePłatności?

0

tak ePlatnosci

0

to bardzo dobrze trafiłeś, jest tam jeden programista który daje radę w Delphi i jest niesamowicie pomocny.

Jak mogę ci doradzić to zacznij od funkcji niesocjalizującej a następnie odczytaj wersje biblioteki, chyba że już to masz opanowane?

Jak coś to teraz muszę lecieć ale jutro wieczorem będę dostępny i coś tam mogę pomóc.

0

super, odezwę się jutro bo na poniedziałek coś już muszę mieć działającego ;);)
dzięki za pomoc

0

na poniedziałek coś już muszę mieć działającego

Dobrze, że chociaż dałeś termin do poniedziałku. Dzisiaj, w innym wątku (który coś czuję, że będzie hitem kwietnia, a może i całego 2019) OP dał termin do godziny 20. Dla osób niewtajemniczonych - chodzi o https://4programmers.net/Forum/1586757, chociaż ogólnie polecam przeczytać cały wątek, jest cudowny :D

1

nie dawałem terminu, to tylko moje zobowiązanie ;) ja proszę o pomoc i jestem wdzięczny za zainteresowanie :)
Sprawdziłem to co kolega Robert podpowiedział i faktycznie te funkcje zmiana nazwy funkcji na to co wyświetla TDUMP troche pomogło.
Teraz funkcja jest wywoływana ale cosik nie tak dalej z tymi parametrami. HeadConv zrobił troche sieczkę z tych funkcji.
Tak więc prośba aktualna - jak ktoś z Was wie jak dobrze zadeklarować ta funkcję w Delphi to proszę o pomoc.

0

Biorąc od uwagę LPCTSTR oczekiwałbym, że funkcja ma dwie nazwy InitializationA i InitializationW. Pomocne może być zbadanie za pomocą Dependency Walker lub chociażby podglądnięcie binarki jakimś sensownym edytorem.

1
cerrato napisał(a):

na poniedziałek coś już muszę mieć działającego

Dobrze, że chociaż dałeś termin do poniedziałku. Dzisiaj, w innym wątku (który coś czuję, że będzie hitem kwietnia, a może i całego 2019) OP dał termin do godziny 20. Dla osób niewtajemniczonych - chodzi o https://4programmers.net/Forum/1586757, chociaż ogólnie polecam przeczytać cały wątek, jest cudowny :D

Przeczytałem ten wątek i chyba jednak troche niesprawiedliwe z Twojej strony - nie dałem nikomu terminu. To mój problem, że muszę to mieć w poniedziałek.

0

nie ma problemu ;) nikt się nie obraża.

Wracajac do senda - to już wiem jak to powinno być i prawie działa.
Program kompletnie się wiesza bez komunikatu przy FreeLibrary :(
Może w tym temacie ktoś pomoże ??

0

Pokaż kod korzystający z tej biblioteki – jej załadowanie, ładowanie funkcji i jej wywołanie.

0

tak testuje działanie tej biblioteki :

procedure TForm1.Button1Click(Sender: TObject);
var       inic:TePInitialization;
          h:Cardinal;
          x:PB_FN_RES;
          synch:TePSynchronize;
          close:TePClose;
          _path:WideString;
          _param:WideString;
          _tid:WideString;
          g:TeGetPosBridgeVersion;
          MajorVersion: Word;
          MinorVersion: Word;
          BuildNumber: Word;
          RevisionNumber: Word;

begin
  h:=LoadLibrary('PosBridge.dll');
  if h<>0 then
   begin
   @g:=GetProcAddress(h, '_GetPosBridgeVersion@16');
   if @g=nil then
    begin
    end
   else
    begin
     x:=g(MajorVersion,MinorVersion,BuildNumber,RevisionNumber);
     if x=PB_FR_OK then
      begin
      end;
    end;

   @inic := GetProcAddress(h, '_Initialization@28');
    if @inic = nil then
     begin
      { function not found.. misspelled? }
      ShowMessage ('blub');
     end
    else
     begin
      { call the function as usually }
      _path:='c:\Temp\';
      _param:='interface=ETH comm_port=5010 broadcast_port=5000';
      _tid:='';
      _tid:=Edit1.Text;
      x := inic(_path,_param,_tid,nil,10,True,7);
      if x=PB_FR_OK then
       begin
        @synch := GetProcAddress(h, '_Synchronize@0');
        if @synch=nil then
         begin
          ShowMessage('no synchronize');
         end
        else
         begin
          x:=synch();
          if x=PB_FR_OK then
           begin
            ShowMessage('Synchronize ok');
           end;
         end;
       end;
      @close:=GetProcAddress(h,'_Close@0');
      if @close=nil then
       begin
        ShowMessage('dupa');
       end
      else
       begin
        x:=close();
        if x=PB_FR_OK then
         begin
         end;
       end;
     end;
    { unload the DLL }

     if FreeLibrary(h) then ShowMessage('Free ok');
   end
end;
0

Trochę znam ten temat, ale nie używałem gotowych bibliotek. Komunikację z terminalem zrobiłem w oparciu o komponenty Indy

0

dostałem dll od ePlatnosci, zakładałem że będzie śmigać bez problemów (np dll do drukarek POSNET działają super i są dobrze opisane). Tutaj teoretycznie się połączyłem, funkcja synchronizacji działa ale już ConnectionTest daje TimeOut. poza tym opis jest dość skromny.
Twoja komunikacja przez Indy to dużo roboty, jest gdzies jakiś opis takiej komunikacji ??

0

@TestowyAPI:
Oprogramowanie transmisji zajęło mi dwa dni.
Opis protokołu dostałem z PeP

1

Zanim zrobiłem implementację w programie obsługi terminala na bieżąco bawiłem się w prostym unicie testującym. Oto jego zawartość, powinna ci zdecydowanie pomóc:
Acha, robiłem to dość dawno temu i to w Delphi 6!

unit Unit1;

interface

uses
  Windows, Controls, StdCtrls, Messages, SysUtils, Variants, Classes, Graphics, Forms, Dialogs, ComCtrls, Unit2;

// Stałe
const
  PB_BUFFER_TID_SIZE = 9;                               // długość bufora danych na identyfikator TID
  PB_BUFFER_COUPON_SIZE = 33;                   // długość bufora danych na identyfikator COUPON (decrypted)
  PB_NO_OPER_CODE = -1;                                // identyfikator określający brak wyboru konkretnego operatora aplikacji płatniczej
  PB_NO_PARAMETER = -1;                                // identyfikator określający nieistotność przekazywanego parametru

type
  PInt = ^Integer;

  PB_PAYAPP_TRXTYPE = (PB_PT_SELL = 1, PB_PT_REVERSAL = 2, PB_PT_REFUND = 3, PB_PT_CASH = 4, PB_PT_PREAUTH = 5,
    PB_PT_PREAUTH_COMPLETION = 6, PB_PT_SELL_CB = 8, PB_PT_READ_CARD_DATA = 60, PB_PT_EOD_REPORT = 70, PB_PT_TRX_REPORT = 71);

  PB_FN_RES =                                   // Typ wyliczeniowy rezultatu wywołania każdej z funkcji API
(PB_FR_OK = 0,                                  // funkcja wykonana prawidłowo
  PB_FR_TIMEOUT = 1,                            // nastąpił timeout wywołania
  PB_FR_POS_BROKEN_DATA = 2,                    // nieprawidłowe dane odesłane przzez terminal POS
  PB_FR_POS_BINDED = 3,                         // terminal wywłaszczony przez innego hosta
  PB_FR_INCORRECT_PARAMS = 4,                   // nieprawidłowe parametruy przekazane do funkcji
  PB_FR_RESOURCES_ERROR = 8,                    // błąd dostępu do zasobów systemowych
  PB_FR_ERROR = 9,                              // ogólny błąd wywołania
  PB_FR_NOINIT = 10);                           // biblioteka niezainicjowana

  PB_PAYMENT_METHOD =                           // Typ wyliczeniowy dopuszczalnych sposobów płatności
(PB_PM_CASH = $01,                              // płatność gotówką
  PB_PM_CARD = $02,                             // płatnośc kartą
  PB_PM_CASH_OR_CARD = $03);                    // płatność karta lub gotówką

  PB_APPTRX_FLAGS =                             // typ wyliczeniowy dodakowych flag określających sposób realizacji transakcji
(PB_TF_DEAFULT = $8000,                         // wartośc domyśla (zabronienie modyfikowania wartości na terminalu)
  PB_TF_NONE = $0,                              // zgaszone wszytkie flagi
  PB_TF_CONTACLESS_CARD_REQUEST = $1,           // żadanie wykonania transakcji kartą bezstykową (tylko transakcje płatnicze)
  PB_TF_EMV_ADDITIONAL_DATA = $2,               // żadanie dodatkowych danych transakcji EMV (tylko transakcje płatnicze)
  PB_TF_AMOUNT_EDIT_DISABLE = $8000,            // zabronienie modyfikowania wartości na terminalu POS
  PB_TF_EV_HOLD_PRINTING = $4,                  // wstrzymanie wydruku kuponu (tylko eVoucher)
  PB_TF_EV_RETURN_CODE = $8,                    // zwrócenie kodu doładowującego do systemu kasowego (tylko eVoucher)
  PB_TF_SILENT_MODE = $10,                      // tryb "cichy" wywołanie z tą flagą zwraca parametry bez uruchamiania drukarki i/lub wyświetlacza
  PB_TF_GET_DATA_BEFORE_PRINT = $20,     	// Żądanie przesłania danych kończących transakcję przez rozpoczęciem wykonywania wydruków (o ile jest to możliwe tylko PLA).
  PB_TF_COMPATIBILITY_MODE = $4000);	        // tryb kompatybilności wstecznej (tylko GiftCard)

  PB_POS_APPS =                                 // Typ wyliczeniowy typów obsługiwanych aplikacji na terminalu POS
(PB_PA_PAYOPT = 1,                              // aplikacja płatnicza
  PB_PA_UTAOPT = 2,                             // aplikacja lojalnościowa
  PB_PA_EVOPT = 4,                              // aplikcaja evoucher
  PB_PA_BILLOPT = 5,                            // aplikacja transkasa
  PB_PA_DEVSRV = 6,                             // aplikacja serwera urządzeń
  PB_PA_LOYOPT = 7,                             // aplikacja lojalnościowa
  PB_PA_BILLBB = 8,                             // aplikacja moje rachunki
  PB_PA_COUPAPP = 9,                            // aplikacja kupony
  PB_PA_GIFTAPP = 10);                          // aplikacja podarunkowa

  PB_TRX_STATUS =                               // typ wyliczeniowy statusow transakcji
(PB_TS_OK = $00,	                        // trx przyjęta
  PB_TS_OK_WAIT_FOR_CONFIRM = $01,	        // trx przyjęta - oczekiwanie na potwierdzenie
  PB_TS_OK_WAIT_FOR_OPERATOR_DECISION = $02,    // trx w trakcie - oczekiwanie na decyzję kasjera
  PB_TS_OK_REPORT_DATA = $03,                   // trx w trakcie - pobieranie danych raportu
  PB_TS_REJECTED_BY_HOST = $10,	                // trx odrzucona przez hosta
  PB_TS_REJECTED_INCORRECT_DATA = $11,	        // trx odrzucona w wyniku nieprawidłowych danych
  PB_TS_REJECTED_UNSPECIFIED_REASON = $12,	// trx odrzucona z innego powodu
  PB_TS_REJECTED_LAST_TRX_UNAPPROVED = $13,     // trx odrzucona, ostatnia transakcja nie została zakończona
  PB_TS_REJECTED_CB_UNSUPPORTED = $14,          // trx odrzucona - cash-back nieobsługiwany
  PB_TS_REJECTED_INSUFFICIENT_PARAMS = $15,     // trx odrzucona - niewystarczająca ilość parametrów
  PB_TS_REJECTED_INCORRECT_PAYMENT_TYPE = $16,  // trx odrzucona - nieprawidłowy typ płatności
  PB_TS_REJECTED_UNSUCCESFUL_PAYMENT = $17,     // trx odrzucona - zapłata za rachunki nie powiodła się
  PB_TS_UNSUFFIFCIENT_FUNDS = $18,              // trx odrzucona - niewystarczające środki
  PB_TS_CARD_EXPIRED = $19,                     // trx odrzucona - karta nieważna (przeterminowana)
  PB_TS_CARD_ERROR = $20,	                // błąd karty
  PB_TS_PIN_UNAUTHORIZED = $21,                 // błąd autoryzacji kodu PIN
  PB_TS_CARD_UNSUPPORTED = $22,	                // karta nieobsługiwana
  PB_TS_NO_PAPER_IN_PRINTER = $23,              // brak papieru w drukarce
  PB_TS_SESSION_KEY_HAS_NOT_SET = $24,          // błąd - nieustalony klucz sesji kryptograficznej
  PB_TS_INTERNAL_OPERATION_ERROR = $25,         // błąd – problem z wykonaniem operacji wewnętrznej
  PB_TS_CANCELLED_BY_USER = $40,	        // operacja przerwana przez użytkownika
  PB_TS_TIMEOUT = $41,                          // timeout operacji
  PB_TS_EOD_REPORT_DOES_NOT_FETCHED = $42,      // raport zamknięcia dnia nie został pobrany
  PB_TS_FUNCTION_NOT_SUPPORTED = $43,           // nieobsługiwana funkcja
  PB_TS_UNDEFINIED = $80,	                // trx odrzucona - nierozpoznany kod błędu
  PB_TS_GENERAL_ERROR = $81);	                // trx odrzucona - błąd ogólny

  PB_PAYAPP_CARD_HOLDER_AUTH_METHOD =           // Sposób autoryzacji posiadacza karty
(PB_CHAM_NOT_AUTHENTICATED = 0,                 // brak autoryzacji
  PB_CHAM_PIN = 1,                              // PIN
  PB_CHAM_MANUAL_SIGNATURE = 5);                // podpis

  PB_PAYAPP_CARD_DATA_INPUT_METHOD =            // Rodzaj użytej karty
(PB_CDIM_MAGNETIC_STRIPE = 2,                   // karta z paskiem magnetycznym
  PB_CDIM_ICC = 5,                              // karta procesorowa
  PB_CDIM_MANUAL_ENTRY = 6,                     // ręczne wprowadzenie
  PB_CDIM_CONTACTLESS_ICC = 7,                  // bezstykowa karta procesorowa
  PB_CDIM_CONTACTLESS_MAG_STRIPE = 8);          // bezstykowa karta typu magstripe (zawierająca tylko obraz paska magnetycznego)

  PB_PAYAPP_CARD_HOLDER_AUTH_ENTITY =           // Podmiot realizujący autoryzację posiadacza karty
(PB_CHAE_NOT_AUTHENTICATED = 0,                 // brak autoryzacji
  PB_CHAE_ICC = 1,                              // karta procesorowa
  PB_CHAE_AUTHORISING_AGENT = 3,                // wystawca karty (bank)
  PB_CHAE_MERCHANT = 4,                         // sprzedawca
  PB_CHAE_OTHER = 5);                           // inny

  PB_PAYAPP_AUTH_MODE =                         // Tryb przetwarzania transakcji
(PB_AM_ONLINE = 1,                              // połączeniowy (online)
  PB_AM_OFFLINE = 3,                            // bezpołączeniowy (offline)
  PB_AM_REFERRAL = 4);                          // autoryzacja głosowa (referral)

  PB_LOYAPP_TRXTYPE = (PB_LT_ADD_POINTS = 1, PB_LT_CORRECTION = 2, PB_LT_PRIZE_DELIVERY = 3, PB_LT_POINTS_TRANSFER = 4);

// Struktura pojedyńczej wartości dodatkowych danych transakcji (EMV)

  PB_PAYAPP_ADDITIONAL_DATA = record
    tag: Word;
    length: Integer;
    value: PBYTE;
  end;

// Struktura danych dodatkowych dla transakcji DCC
  PB_PAYAPP_DCC_DATA = record
    is_dcc_transaction: Boolean;
    currency_amount: Integer;
    decimal_digits: Integer;
    currency_code: array[0..3] of WideChar;
    currency_rate: Single;
    fee_description: array[0..20] of WideChar;
    decision_timeout: Integer;
    decision_id: Integer;
  end;

// Struktura danych szczegółów przyjętej transakcji płatniczej
  PB_PAYAPP_TRXEND = record
    trx_type: PB_PAYAPP_TRXTYPE;
    amount: Integer;
    STAN: Integer;
    authorization_code: array[0..12] of WideChar;
    operator_code: Integer;
    tid: array[0..PB_BUFFER_TID_SIZE - 1] of WideChar;
    trx_datetime: SYSTEMTIME;
    masked_pan_number: array[0..19] of WideChar;
    amount_cb: Integer;
    card_name: array[0..32] of WideChar;
    card_holder_auth_method: PB_PAYAPP_CARD_HOLDER_AUTH_METHOD;
    card_holder_input_method: PB_PAYAPP_CARD_DATA_INPUT_METHOD;
    card_holder_auth_entity: PB_PAYAPP_CARD_HOLDER_AUTH_ENTITY;
    auth_mode: PB_PAYAPP_AUTH_MODE;
    additional_data_count: Integer;
    additional_data: PB_PAYAPP_ADDITIONAL_DATA;
    dcc_data: PB_PAYAPP_DCC_DATA;
  end;

  {/// Struktura danych pobranych z karty lojalnościowej }
  PB_LOYAPP_CARDDATA = record
    STAN: Integer;
    operator_code: Integer;
    tid: array[0..PB_BUFFER_TID_SIZE - 1] of WideChar;
    trx_datetime: SYSTEMTIME;
    points_qty: Integer;
    expiration_date: SYSTEMTIME;
    client_group: Integer;
    second_track: array[0..38 - 1] of WideChar;
  end;

  {/// Struktura danych szczegółów przyjętej transakcji lojalnościowej }
  PB_LOYAPP_TRXEND = record
    trx_type: PB_LOYAPP_TRXTYPE;
    amount: Integer;
    STAN: Integer;
    operator_code: Integer;
    tid: array[0..PB_BUFFER_TID_SIZE - 1] of WideChar;
    trx_datetime: SYSTEMTIME;
    points_before_trx: Integer;
    points_before_trx_2: Integer;
    points_qty: Integer;
    second_track: array[0..38 - 1] of WideChar;
  end;

  TPB_PAYAPP_TRXEND = ^PB_PAYAPP_TRXEND;

  TPB_LOYAPP_TRXEND = ^PB_LOYAPP_TRXEND;

  TPB_LOYAPP_CARDDATA = ^PB_LOYAPP_CARDDATA;

  TPB_TRX_STATUS = ^PB_TRX_STATUS;

  TForm1 = class(TForm)
    btnsynchronizacja: TButton;
    edtconlink: TEdit;
    edtloglink: TEdit;
    edttid: TEdit;
    edthist: TEdit;
    edttimeout: TEdit;
    btninicjalizacja: TButton;
    btnwersja: TButton;
    btnsprzedaz: TButton;
    mmo1: TMemo;
    btnkopia: TButton;
    btnclose: TButton;
    cbbtest: TComboBox;
    btntestuj: TButton;
    btn1: TButton;
    btnpln: TButton;
    btnwaluta: TButton;
    btnpodpisok: TButton;
    btnpodpisfalse: TButton;
    pbpasek: TProgressBar;
    btnstart: TButton;
    btnstop: TButton;
    btnrestart: TButton;
    btnsaldo: TButton;
    lbl1: TLabel;
    lbl2: TLabel;
    btndodaj1000: TButton;
    procedure btnwersjaClick(Sender: TObject);
    procedure btninicjalizacjaClick(Sender: TObject);
    procedure btnsynchronizacjaClick(Sender: TObject);
    procedure btnsprzedazClick(Sender: TObject);
    procedure btnkopiaClick(Sender: TObject);
    procedure btncloseClick(Sender: TObject);
    procedure btntestujClick(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    procedure btnplnClick(Sender: TObject);
    procedure btnsaldoClick(Sender: TObject);
    procedure btnstartClick(Sender: TObject);
    procedure btnstopClick(Sender: TObject);
    procedure btnrestartClick(Sender: TObject);
    procedure btndodaj1000Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  card_data: PB_LOYAPP_CARDDATA;
  response_code: PB_TRX_STATUS;

function PB_GetPosBridgeVersion(MajorVersion: PInt; MinorVersion: PInt; BuildNumber: PInt; RevisionNumber: PInt):
  PB_FN_RES; stdcall; external 'PosBridge.dll' name '_GetPosBridgeVersion@16';

function PB_Initialization(storage_path: PWideChar; connection_params: PWideChar; tid: PWideChar; ProccessInfoCallback:
  PInt; transmission_timeout: Integer; loging_to_file: Boolean; report_data_cleaning_depth: Integer): PB_FN_RES; stdcall;
  external 'PosBridge.dll' name '_Initialization@28';

function PB_Synchronize(): PB_FN_RES; stdcall; external 'PosBridge.dll' name '_Synchronize@0';

function PB_Close(): PB_FN_RES; stdcall; external 'PosBridge.dll' name '_Close@0';

function PB_PayAppPrintReceiptCopy(): PB_FN_RES; stdcall; external 'PosBridge.dll' name '_PayAppPrintReceiptCopy@0';

function PB_ConnectionTest(application: PB_POS_APPS; tid: PWideChar): PB_FN_RES; stdcall; external 'PosBridge.dll' name
  '_ConnectionTest@8';

function PB_PayAppSell(ProccessInfoCallback: PInt; amount: LongInt; cb_amount: LongInt; payment_title: PWideChar; flags:
  LongInt; operator_code: Integer): PB_FN_RES; stdcall; external 'PosBridge.dll' name '_PayAppSell@24';

function PB_LoyAppPrizeDelivery(ProccessInfoCallback: PInt; prize_qty: Integer; points_qty: Integer; prize_name: PWideChar;
  ext_prize_id: PWideChar; track2: PWideChar; flags: Integer; operator_code: Integer): PB_FN_RES; stdcall; external 'PosBridge.dll' name
  '_LoyAppPrizeDelivery@32';

function PB_LoyAppFetchCardData(card_data: TPB_LOYAPP_CARDDATA; response_code: TPB_TRX_STATUS; operation_code: Integer;
  time_out: Integer): PB_FN_RES; stdcall; external 'PosBridge.dll' name '_LoyAppFetchCardData@16';

function PB_LoyAppAddPoints(ProccessInfoCallback: PInt; amount: LongInt; receipt_number: PWideChar;
  points_qty: Integer; promo_points_qty: Integer; duty_amount: Integer; track2: PWideChar; flags: Integer; operator_code: Integer): PB_FN_RES; stdcall; external 'PosBridge.dll' name
  '_LoyAppAddPoints@36';

implementation

{$R *.dfm}

{/// Typ wyliczeniowy rezultatu wywołania każdej z funkcji API }
function status_wywolania(err: PB_FN_RES): string;
begin
  case err of
    PB_FR_OK:
      Result := 'PB_FR_OK - Funkcja wykonana poprawnie';
    PB_FR_TIMEOUT:
      Result := 'PB_FR_TIMEOUT - Nastąpił timeout wykonania operacji na terminalu POS';
    PB_FR_POS_BROKEN_DATA:
      Result := 'PB_FR_POS_BROKEN_DATA - Terminal POS zwrócił nieprawidłowe dane';
    PB_FR_POS_BINDED:
      Result := 'PB_FR_POS_BINDED - Terminal wywłaszczony przez innego hosta';
    PB_FR_INCORRECT_PARAMS:
      Result := 'PB_FR_INCORRECT_PARAMS - Przekazano nieprawidłowe wartości argumentów przy wywołaniu funkcji';
    PB_FR_RESOURCES_ERROR:
      Result :=
        'PB_FR_RESOURCES_ERROR - Błąd dostępu do zasobów systemowych (dostęp do plików, dostęp do interfejsów komunikacyjnych)';
    PB_FR_ERROR:
      Result := 'PB_FR_ERROR - Błąd ogólny';
    PB_FR_NOINIT:
      Result := 'PB_FR_NOINIT - Biblioteka nie została zainicjowana';
  else
    Result := '? - Inny błąd - nieznany!';
  end;
end;

function status_wykonania(status: PB_TRX_STATUS): string;
begin
  case status of
    PB_TS_OK:
      Result := 'PB_TS_OK - trx przyjęta';
    PB_TS_OK_WAIT_FOR_CONFIRM:
      Result := 'PB_TS_OK_WAIT_FOR_CONFIRM - trx przyjęta - oczekiwanie na potwierdzenie';
    PB_TS_OK_WAIT_FOR_OPERATOR_DECISION:
      Result :=
        'PB_TS_OK_WAIT_FOR_OPERATOR_DECISION - trx w trakcie - oczekiwanie na decyzję kasjeratrx w trakcie - oczekiwanie na decyzję kasjera';
    PB_TS_OK_REPORT_DATA:
      Result := 'PB_TS_OK_REPORT_DATA - trx w trakcie - pobieranie danych raportu';
    PB_TS_REJECTED_BY_HOST:
      Result := 'PB_TS_REJECTED_BY_HOST - trx odrzucona przez hosta';
    PB_TS_REJECTED_INCORRECT_DATA:
      Result := 'PB_TS_REJECTED_INCORRECT_DATA - trx odrzucona w wyniku nieprawidłowych danych';
    PB_TS_REJECTED_UNSPECIFIED_REASON:
      Result := 'PB_TS_REJECTED_UNSPECIFIED_REASON - trx odrzucona z innego powodu';
    PB_TS_REJECTED_LAST_TRX_UNAPPROVED:
      Result := 'PB_TS_REJECTED_LAST_TRX_UNAPPROVED - trx odrzucona, ostatnia transakcja nie została zakończona';
    PB_TS_REJECTED_CB_UNSUPPORTED:
      Result := 'PB_TS_REJECTED_CB_UNSUPPORTED - trx odrzucona - cash-back nieobsługiwany';
    PB_TS_REJECTED_INSUFFICIENT_PARAMS:
      Result := 'PB_TS_REJECTED_INSUFFICIENT_PARAMS - trx odrzucona - niewystarczająca ilość parametrów';
    PB_TS_REJECTED_INCORRECT_PAYMENT_TYPE:
      Result := 'PB_TS_REJECTED_INCORRECT_PAYMENT_TYPE - trx odrzucona - nieprawidłowy typ płatności';
    PB_TS_REJECTED_UNSUCCESFUL_PAYMENT:
      Result := 'PB_TS_REJECTED_UNSUCCESFUL_PAYMENT - trx odrzucona - zapłata za rachunki nie powiodła się';
    PB_TS_UNSUFFIFCIENT_FUNDS:
      Result := 'PB_TS_UNSUFFIFCIENT_FUNDS = trx odrzucona - niewystarczające środki';
    PB_TS_CARD_EXPIRED:
      Result := 'PB_TS_CARD_EXPIRED - trx odrzucona - karta nieważna (przeterminowana)';
    PB_TS_CARD_ERROR:
      Result := 'PB_TS_CARD_ERROR - błąd karty';
    PB_TS_PIN_UNAUTHORIZED:
      Result := 'PB_TS_PIN_UNAUTHORIZED - błąd autoryzacji kodu PIN';
    PB_TS_CARD_UNSUPPORTED:
      Result := 'PB_TS_CARD_UNSUPPORTED - karta nieobsługiwana';
    PB_TS_NO_PAPER_IN_PRINTER:
      Result := 'PB_TS_NO_PAPER_IN_PRINTER - brak papieru w drukarce';
    PB_TS_SESSION_KEY_HAS_NOT_SET:
      Result := 'PB_TS_SESSION_KEY_HAS_NOT_SET - błąd - nieustalony klucz sesji kryptograficznej';
    PB_TS_INTERNAL_OPERATION_ERROR:
      Result := 'PB_TS_INTERNAL_OPERATION_ERROR - błąd – problem z wykonaniem operacji wewnętrznej';
    PB_TS_CANCELLED_BY_USER:
      Result := 'PB_TS_CANCELLED_BY_USER - operacja przerwana przez użytkownika';
    PB_TS_TIMEOUT:
      Result := 'PB_TS_TIMEOUT - timeout operacji';
    PB_TS_EOD_REPORT_DOES_NOT_FETCHED:
      Result := 'PB_TS_EOD_REPORT_DOES_NOT_FETCHED - raport zamknięcia dnia nie został pobrany';
    PB_TS_UNDEFINIED:
      Result := 'PB_TS_UNDEFINIED - trx odrzucona - nierozpoznany kod błędu';
    PB_TS_GENERAL_ERROR:
      Result := 'PB_TS_GENERAL_ERROR - trx odrzucona - błąd ogólny	';
    PB_TS_FUNCTION_NOT_SUPPORTED:
      Result := 'PB_TS_FUNCTION_NOT_SUPPORTED - nieobsługiwana funkcja';
  else
    Result := '? - Inny błąd - nieznany!';
  end;
end;

procedure PB_FnAppsProcessInfo(application: PB_POS_APPS; phase_id: UINT; phase_description: PWideChar); stdcall;
begin
  Form1.mmo1.Lines.Append(IntToStr(phase_id) + ' -> ' + WideCharToString(phase_description));
end;

procedure PB_FnLoyAppTrxEnd(trx_status: PB_TRX_STATUS; trx_details: TPB_LOYAPP_TRXEND); stdcall;
begin
  Form1.mmo1.Lines.Append(status_wykonania(trx_status));  // dostaje informacje o szczegolach transakcji
  if Integer(trx_status) = 0 then
  begin
  {  Form1.mmo1.Lines.Append('------------------------');
    Form1.mmo1.Lines.Append('amount = ' + IntToStr(trx_details^.amount));
    Form1.mmo1.Lines.Append('STAN = ' + IntToStr(trx_details^.STAN));
    Form1.mmo1.Lines.Append('operator_code = ' + inttostr(trx_details^.operator_code));

    Form1.mmo1.Lines.Append('trx_datetime = ' + DateTimetoStr(SystemTimetoDateTime(trx_details^.trx_datetime)));
    Form1.mmo1.Lines.Append('points_before_trx = ' + IntToStr(trx_details^.points_before_trx));
    Form1.mmo1.Lines.Append('points_before_trx_2 = ' + IntToStr(trx_details^.points_before_trx_2));
    Form1.mmo1.Lines.Append('points_qty = ' + IntToStr(trx_details^.points_qty));
    Form1.mmo1.Lines.Append('second_track = ' + WideCharToString(trx_details^.second_track));   }
  end;
end;

procedure PB_FnPayAppTrxEnd(trx_status: PB_TRX_STATUS; trx_details: TPB_PAYAPP_TRXEND); stdcall;
begin
  Form1.mmo1.Lines.Append(status_wykonania(trx_status));  // dostaje informacje o szczegolach transakcji
  if Integer(trx_status) = 2 then
  begin
 {  currency_amount: Integer;
    decimal_digits: Integer;
    currency_code: array[0..3] of WideChar;
    currency_rate: Single;
    fee_description: array[0..20] of WideChar;
    decision_timeout: Integer;
  --  is_dcc_transaction: Boolean;
    decision_id: Integer;}

    Form1.mmo1.Lines.Append('------------------------');
    Form1.mmo1.Lines.Append('trx_type = ' + IntToStr(trx_details^.dcc_data.currency_amount));
    Form1.mmo1.Lines.Append('decimal_digits = ' + IntToStr(trx_details^.dcc_data.decimal_digits));
    Form1.mmo1.Lines.Append('currency_code = ' + WideCharToString(trx_details^.dcc_data.currency_code));
    Form1.mmo1.Lines.Append('currency_rate = ' + FloatToStr(trx_details^.dcc_data.currency_rate));
    Form1.mmo1.Lines.Append('fee_description = ' + WideCharToString(trx_details^.dcc_data.fee_description));
    Form1.mmo1.Lines.Append('decision_timeout = ' + IntToStr(trx_details^.dcc_data.decision_timeout));
    Form1.mmo1.Lines.Append('decision_id = ' + IntToStr(trx_details^.dcc_data.decision_id));
  end;
end;

procedure TForm1.btnwersjaClick(Sender: TObject);
var
  MajorVersion, MinorVersion, BuildNumber, RevisionNumber: Integer;
  ret: PB_FN_RES;
begin
  ret := PB_GetPosBridgeVersion(@MajorVersion, @MinorVersion, @BuildNumber, @RevisionNumber);
  MessageBox(0, PChar(IntToStr(Integer(ret)) + '->' + IntToStr(MajorVersion) + '.' + IntToStr(MinorVersion) + '.' +
    IntToStr(BuildNumber) + '.' + IntToStr(RevisionNumber)), 0, 0);
end;

procedure TForm1.btninicjalizacjaClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_Initialization(PWideChar(WideString(edtloglink.Text)), PWideChar(WideString(edtconlink.Text)), PWideChar(WideString
    (edttid.Text)), @PB_FnAppsProcessInfo, StrToInt(edttimeout.Text), True, StrToInt(edthist.Text));
  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btnsynchronizacjaClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_Synchronize();
  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btnsprzedazClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_PayAppSell(@PB_FnPayAppTrxEnd, 1000, 0, PWideChar(WideString('test')), 32768, -1);
  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btnkopiaClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_PayAppPrintReceiptCopy();
  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btncloseClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_Close();
  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btntestujClick(Sender: TObject);
var
  ret: PB_FN_RES;
  tid: PWideChar;
begin
  tid := nil;
  case cbbtest.ItemIndex of
    0:
      ret := PB_ConnectionTest(PB_PA_PAYOPT, tid);
    1:
      ret := PB_ConnectionTest(PB_PA_UTAOPT, tid);
    2:
      ret := PB_ConnectionTest(PB_PA_EVOPT, tid);
    3:
      ret := PB_ConnectionTest(PB_PA_BILLOPT, tid);
    4:
      ret := PB_ConnectionTest(PB_PA_DEVSRV, tid);
    5:
      ret := PB_ConnectionTest(PB_PA_LOYOPT, tid);
    6:
      ret := PB_ConnectionTest(PB_PA_BILLBB, tid);
    7:
      ret := PB_ConnectionTest(PB_PA_COUPAPP, tid);
    8:
      ret := PB_ConnectionTest(PB_PA_GIFTAPP, tid);
  end;
  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
//  ShowMessage(PB_TRX_STATUS(1));
end;

procedure TForm1.btnplnClick(Sender: TObject);
begin
//  mmo1.Lines.Append(@PB_FnPayAppTrxEnd);
end;

procedure TForm1.btnsaldoClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_LoyAppFetchCardData(@card_data, @response_code, -1, 10);

  if Integer(ret) = 0 then
  begin
    if Integer(response_code) = 0 then
    begin

    end;
  end;
end;

procedure TForm1.btnstartClick(Sender: TObject);
begin
  lbl1.Caption := WideCharToString(card_data.second_track);
end;

procedure TForm1.btnstopClick(Sender: TObject);
begin
  lbl2.Caption := IntToStr(Integer(card_data.points_qty));
end;

procedure TForm1.btnrestartClick(Sender: TObject);
var
  ret: PB_FN_RES;
begin
//ret := PB_PayAppSell(@PB_FnPayAppTrxEnd, 1000, 0, PWideChar(WideString('test')), 32768, -1);
  ret := PB_LoyAppPrizeDelivery(@PB_FnLoyAppTrxEnd, 0, 100, nil, nil, card_data.second_track,$8010, -1);
//  mmo1.Lines.Add(status_wywolania(ret));
end;

procedure TForm1.btndodaj1000Click(Sender: TObject);
var
  ret: PB_FN_RES;
begin
  ret := PB_LoyAppAddPoints(@PB_FnLoyAppTrxEnd, 500, PWideChar(WideString('3453456346')), 0, 0, 0, nil, $8010, -1);
//  mmo1.Lines.Add(status_wywolania(ret));
end;

end.
0

Super, bardzo dziękuję

1 użytkowników online, w tym zalogowanych: 0, gości: 1