Χρήση Ελληνικών στα πεδία και request/resource structs memory allocations

ΕΡΩΤΗΜΑ: Υλοποιώ το socket πρωτόκολλο με χρήση του EcrDll.dll σε Embarcadero Delphi 11.2. Έχω μεταφράσει το C header file ecr2eft.h και προσπαθώ να κάνω δοκιμαστικές κλήσεις στον Simulator. Έχω τα εξής ερωτήματα:

1. Τα char* buffers των request/resource structs με ποιον τρόπο γίνονται allocate στη μνήμη; Μετά από δοκιμές διαπίστωσα ότι οι buffers των response structs γίνονται allocate από το dll οπότε το response struct πρέπει να έχει τους pointers NULL και όχι να τους έχει κάνει ήδη allocate αλλιώς υπάρχει memory leak και είναι ευθύνη του caller να κάνει free αυτά τα buffers μετά από κάθε κλήση. Μετά από δοκιμές κατέληξα ότι το dll φαίνεται να χρησιμοποιεί τον COM allocator (IMAlloc object ή CoTaskMemAlloc()/CoTaskMemFree()). Είναι σωστό αυτό;

2. Τα πεδία που περιέχουν κείμενο που μπορεί να είναι στα ελληνικά (π.χ. merchantName, address, city κτλ.) πώς πρέπει να γίνονται encoded; Παρατήρησα π.χ. ότι αν καλέσω την echo() και περάσω στην παράμετρο text ANSI ελληνικό κείμενο (Win-1253) το αντίστοιχο πεδίο text στο response μου το επιστρέφει utf-8 encoded. Για παράδειγμα το κείμενο 'Γειά σας! επιστρέφεται ως 'Γειά σας!' που είναι η utf-8 encoded μορφή του. Αν στείλω το κείμενο utf-8 encoded μου το επιστρέφει δύο φορές encoded που είναι unintelligible. Αυτό δεν θα έπρεπε να συμβαίνει.

1 Comment

Please find our answers bellow:


1. Integration of library suppose that ECR application (not library) allocating and deallocating memory for arguments of library functions.

For clear C++ application memory for structures (Request and response) should allocated by ECR application. When deallocation of Response structures called, destructor for deallocation contained fields will called. For request structure, since ECR application allocating memory for containing fields, deallocation of them should be performed before deallocation of Request structure itself.

We do not use functions CoTaskMemAlloc()/CoTaskMemFree() that you mentioned. We see (for example in this example https://stackoverflow.com/questions/393509/usage-of-cotaskmemalloc) that this may be used in direct allocation from library in way to forward data up (to application level) but we used way I described before. Technically for allocating memory to char pointers in response structure we use standard C++ new operator and delete/delete[] for deallocation it in destructor of response structures).


2. Library accept incoming string, forwarding to POS and in versa direction as is. It is not performing any encoding transformation. So encoding is point of agreement ECR application and POS only. Next moment is request and response data are independent. Echo (like all other methods) works following: Application sent some data and POS should fill corresponding field for answer at its side (even from scratch, may be copy – it is question of POS implementation). For example POS Emulator that we providing developed to send UTF-8 strings to ECR, So if you used our emulator and sent ANSI string it is expected result.

Login or Signup to post a comment