Перевести с C # на ПРОГРЕСС ОТКРЫТИЕ ABL - PullRequest
0 голосов
/ 10 октября 2019

Я получил C # DLL для доступа к API и другой C # для вызова DLL.

Я пытаюсь создать ABL-программу для вызова DLL.

Я пытался использовать, также запустите его как ВНЕШНЕЕ, но не повезло.

Никогда не использовал C #, но похоже, что очень простая программа не может найти способ установить DLL из ABL.

Заранее спасибо,

Гюго

Вот код C #, будем благодарны за любую помощь

Код:

using System;
using System.Windows.Forms;

namespace CayanConnectSample
{
    public partial class MainFrm : Form
    {
        public MainFrm()
        {
            InitializeComponent();
        }

        private string merchantName = "Test Dynamic Payments";
        private string merchantSiteId = "2Q5JSJH3";
        private string merchantKey = "GQPXT-GTJTP-66A1Y-RWT5G-CNULU";
        private string terminalIPAddress = "192.168.1.32"; //ip address in CDI Technologies
        private int requestTimeout = 60;

        private void btnCreateTransaction_Click(object sender, EventArgs e)
        {

            decimal amount = Convert.ToDecimal(0.09);
            string clerkId = "MIKE";

            //only transactionType used are sale & refund
            CayanConnect.CreateTransaction.Request request = new CayanConnect.CreateTransaction.Request()
            {
                MerchantName = merchantName,
                MerchantSiteId = merchantSiteId,
                MerchantKey = merchantKey,
                TransactionType = CayanConnect.CreateTransaction.TransactionTypeEnum.SALE,
                ClerkId = clerkId,
                Dba = merchantName,
                Amount = amount,
                //[Amount] is always positive.  TransactionType has the sign.  Sale or Refund
                OrderNumber = "1234"
            };

            CayanConnect.CreateTransaction createTrx = new CayanConnect.CreateTransaction();

            CayanConnect.CreateTransaction.Response ctr = createTrx.Process(request, CayanConnect.ThemeEnum.None);

            if (ctr.Success)
            {
                CayanConnect.InitiateTransaction it = new CayanConnect.InitiateTransaction(terminalIPAddress, ctr.TransportKey, null, CayanConnect.ThemeEnum.None, "Waiting for customer...");

                CayanConnect.InitiateTransaction.Response response = it.Process(requestTimeout, true);

                string emvDetail = response.EMVDetail;
                bool approved = false;


                if (response.Success)
                {
                    //THERE IS NO TIMEOUT OR ERROR CALLING THE SERVICE
                    if (response.Status.ToUpper() == "APPROVED")
                    {
                        //AN AMOUNT HAS BEEN APPROVED
                        if (Convert.ToDecimal(Math.Abs(amount)) == response.AmountApproved)
                        {
                            //FULL AMOUNT APPROVED
                            approved = true;
                            txtResponse.Text = "Good to go!!";
                        }
                        else
                        {
                            //PARTIALLY APPROVED, HAS TO VOID THIS
                            string v = this.VoidApprovedTransaction(response.Token);
                            string em = v.IsEmpty() ? "Transaction was voided succesfully." : v;
                            txtResponse.Text = $"Invalid approved amount.{Environment.NewLine}Amount: {amount.ToString("C")}{Environment.NewLine}Approved Amount: {response.AmountApproved.ToString("c")}{em}";
                        }
                    }
                    else
                    {
                        //AMOUNT WAS DECLINED
                        txtResponse.Text = response.DeclinedMessage(amount);
                    }
                }
                else
                {
                    //THERE WAS A PROBLEM CALLING THE SERVICE
                    txtResponse.Text = response.ErrorMessage;
                }
            }
            else
            {
                //THERE WAS A PROBLEM CALLING THE SERVICE
                txtResponse.Text = ctr.ErrorMessage;
            }
        }
        private string GetStatus()
        {
            string rt = string.Empty;

            CayanConnect.GetStatus status = new CayanConnect.GetStatus(this.terminalIPAddress, null, CayanConnect.ThemeEnum.None, "Verifying terminal status...");
            CayanConnect.GetStatus.Response statusResponse = status.Process(this.requestTimeout);

            rt = statusResponse.ToXml();

            return rt;
        }
        private string VoidApprovedTransaction(string token)
        {
            string rt = string.Empty;

            CayanConnect.Void _void = new CayanConnect.Void();

            CayanConnect.Void.Request request = new CayanConnect.Void.Request()
            {
                MerchantName = this.merchantName,
                MerchantKey = this.merchantKey,
                MerchantSiteId = this.merchantSiteId,
                Token = token,
                Timeout = this.requestTimeout
            };

            CayanConnect.Void.Response response = _void.Process(request, CayanConnect.ThemeEnum.None);

            if (!response.Success)
            {
                rt = $"Error voiding transaction.{Environment.NewLine}{Environment.NewLine}{response.ErrorMessage}";
            }

            return rt;
        }

        private void btnIsOnLine_Click(object sender, EventArgs e)
        {
            txtResponse.Text = GetStatus();
        }
    }
}

============================================================================

1 Ответ

2 голосов
/ 10 октября 2019

Вам не нужно «вызывать» DLL. Я обнаружил, что документ DLL очень важен для чтения - вам нужно знать такие вещи, как то, кто отвечает (ABL или DLL) за распределение и освобождение памяти, размеры структуры и т. Д. Кроме того, AVM не re-entrant (поэтому не может быть зарегистрирован как обратный вызов для любой DLL).

Для примера вызова функций DLL / SO из класса ABL, посмотрите в репо на https://github.com/PeterJudge-PSC/abl_odbc_api.

Вам нужно будет создать прототипы функций (см. Пример на https://github.com/PeterJudge-PSC/abl_odbc_api/blob/master/src/OpenEdge/Data/ODBC/ODBCConnectionProto.i), и затем вы сможете вызывать эти функции из метода. Посмотрите на https://github.com/PeterJudge-PSC/abl_odbc_api/blob/master/src/OpenEdge/Data/ODBC/SqlCommonFunctions.cls для примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...