DLL Delphi_ [オブジェクトには、次のメソッドの呼び出し]を呼び出す方法

ユニットPayIntf_MisDll; 

インタフェースが

使用する
  Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、
  ダイアログ、StdCtrls; 

タイプの
  {/ *トランザクションタイプ: '00'消費'01'は元に戻す'02'のリターン'03'チャールズI 
                  " 04「リプリント」05「記号」06「請求」08「先端」09「事前承認
                  11「追加の事前承認を取る」」10 12「事前承認が取り消さ「事前承認が完了した」
                  13「の事前承認が失効を完了」」14「モールステージング「15」特設ステージ
                  「16」に段階的に廃止「18」のステージクレジットクエリ「19」洗車カード
                  「20」クイックペイ「21」指定口座Quancun「22」電子現金リターン
                  '24より「23」電子現金小切手より「償還消費」25「引き換える取り消し
                  」26「チェックポイント」28'株式の積分問い合わせ「29」の積分消費者の利益
                  「30」、積分権利失効「34」金融支払償還のための転送うち「33」の「32」カード
                  「60'-重合支払いが掃引さ
                  61'-重合支払いメインスイープ」 
                  62'-重合充電復帰」 
                  」63'- POSは、2次元コードデータを取得するスキャンコード銃
                  「64'-異常のための単一の重合決済注文
                  」72'-異常の重合決済注文
                  「90'-譲歩の利益に運転したことにより、スタンド銀行カードは
                  「94'-ホイは、2次元コードの割引CUPによってアップ運転
                  95'-クラウド雷有料プラン、マイナストランザクション」
                  「96'-モールの段階のお得な情報、マイナス
                  * /} 
  TInputData =録音が
    POSID:配列を[0..7 ]チャー; // / *キャッシュレジスタの数(8つのバイトは、スペースの不足を補完する、左寄せ)* / 
    operid:チャーの配列[0..7]; // / *オペレータ番号(8つのバイト空間の左、補体欠乏)* / 
    トランス:チャーの配列[0..1]; //トランザクションのタイプ上記参照
    量:チャーの配列[0..11] ; // / * 量(12のバイト何小数点ない、左塗りつぶし0、単位:分)* /
    OLD_DATE:charの配列[0..7] ; // / * 元の取引日(8バイト、YYYYMMDDフォーマット、隔日リターン付き)* / 
    old_reference:チャーの配列[0..11]; // / * * /元のトランザクションの参照番号 
    TRK2:チャーの配列[0..36]; // / * 2つのトラックデータ(37のバイトは、スペースの不足を補完する、左寄せ)* /
    old_trace:charの配列[0..5] ; // / * シリアル番号(右、最大6つのバイトは、リターンまたは再印刷して、0を左)* / 
    old_batch:charの配列[0..5] ; // / * 57 -元のロット番号の62 * / 
    old_auth:配列[0..5]チャー; // /〜* 63 68イハラ認証コード* / 
    old_terno:配列[0..7]のチャー; // / * 69〜76イハラ取引端末数* / 
    szFenqiNum:チャーの配列[0..1]; // / * 77〜78ビット番号03,06,09,12,18,24段階、 * 36,42,48,60 / 
    szServiceNumに:charの配列[0..1]; // / * 79〜80魏は、サービス番号* /楽しむ
    szGoodsNo:charの配列[0..11]を; // / * 81 92の商品アイテムコード* / 
    TRK3:チャーの配列[0..103]; // / * 3つのトラックデータ(104のバイトは、スペースの不足を補完する、左寄せ)* / 
    LRC:配列[0 .. 2]チャー; // / *(0 9から3までのランダムな文字)データトランザクションをチェック* / 
    szOrderTrace:配列[0..19]チャー; // 2015年6月16日に水を加え、銀(以下の場合はスペースを残しませんオーダー) 
    szPrefer:チャーの配列[0..49]; //クーポンより少ない場合はスペースを残し
    szRsv:charの配列[0..299] ; // この入力コードデータ空間の二次元コードの予約フィールド左未満の場合
  END; 

  TOutPutData =レコード
    resp_code:配列[0..1]のチャー; // / * 1〜2ビットの戻りコード(2バイトの"00"成功トランザクション、他の障害)* / 
    bank_code:チャーの配列[0..3]; // / *〜3 6のバンクビットライン。番号(4バイト)* / 
    CARD_NO:チャーの配列[0..29]; // /〜* 36カード番号7:622 280 4860 * ********* / 
    exprの:配列[0 .. 3]チャー; // / * 37〜40 有効ビット(4バイト)* / 
    量:[0..11] charの配列; // /〜* 141はビット52である量(12バイト、ない小数点であり、 0アップ左、単位:分)* / 
    トレース:配列[0..5]チャー; // /〜* 53れる58ビットのシリアル番号(6バイト、左)* /
    [0..11] charの配列を:参照 ; // / * 59〜70 ビットトランザクション参照番号* /  
    AUTH:[0..5] charの配列; // /〜* 71である76桁のライセンス番号* /
    / // /〜* 77 * 82ビットのバッチ番号、文字の配列[0..5]:BATCH 
    日付:配列[0..13]チャー ; // / * 83〜96 ビットの取引日(8バイト、YYYYMMDDHHMMSS形式)* / 
    userNo:charの配列[0 ... 14]; // /〜* 97 111ビジネスの数* / 
    Terno:配列[0..7]チャー; // / *号の端子112〜119 * / 
    old_terno:配列[0..7]チャー; // / *ビット120〜127元の端末番号* / 
    resp_chin:チャーの配列[0..49]; // / *エラーの説明(左揃え、及びギャップ充填空間)* / 
    あるOrderNo:配列[0..49]チャー; // / *注文トランザクション注文番号次元コード* / 
    トランス:チャーの配列[0..1]; // / *トランザクションタイプ* / 
    ChannelType:チャーの配列[0..1]; // / * '0'は、2つのCUP二次元コード「1」マイクロチャンネル「2」Alipayの「3」ロング支払い* / 
    LRC:チャーの配列[0..2]。// / * 'sのチェックコード(3バイト)* /
  終わり; 
 
関数PayIntf_Trans(ParkCode、OptorCode 、トランス、マネー、OldTrandID:文字列 ; VARのあるOrderNo:文字列):ブール;

機能GetInputStr(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列; VARのInStr関数:文字列):ブール; 

手順GetOutputData(OutStr:文字列); 

手順FillArrayChar(FillType、ParamVaule:文字列; VARのArrVaule:文字の配列)。

機能GetOldTradeInfo(OldTrandID:文字列; VARのOLD_DATE、old_reference、old_trace:文字列):ブール; 

機能CheckDataValid(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列):ブール; 

機能Obj2Json_InputData(入力データ:TInputData):文字列。

機能Obj2Json_OutputData(出力データ:TOutputData):文字列。

手順MyWriteLog(constのMSTR:文字列); 

関数BankTrans(PInStr:PChar型; POutStr:PCHAR):整数。STDCALL; 外部の'C:\ landiccbmispos \ MisPos.dll'; // 0-成功、其他-失败
 
実装

CheckDataValid機能(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列):ブール; 
VARの
  SMSG、sFileDLL:文字列; 
始める
  の検索結果を:= falseは、
  sFileDLL:= 'C:\ landiccbmispos \ MisPos.dll'; 
  IFないFILEEXISTS(sFileDLL )その後、
  開始
    SMSGを:=「コール支払インターフェースファイルが存在しません!'; 
    MyWriteLog(SMSG +' [ '+ + sFileDLL'] '); 
    Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 
    出口; 
  END; 

  IF(トランス<>' 00「)および(トランス< > '01')および(トランス<> '02')
  および(トランス<> '05')および(トランス<> '06')//次いで'00'消費'01'が'02'の戻りを元に戻す'03' 「05」記号「06」以上のものをご確認ください 
  クリア開始
    =「不正なトランザクションタイプ:SMSGを!';  
    MyWriteLog(SMSG)。
    Application.MessageBox(PChar型(SMSG)、'プロンプト」、MB_OK)。 
    出口; 
  END; 
  IF(トランス= '01')または(トランス= '02')その後、
  インクルードが始まる
    OldTrandID = ''、その後のIF 
    始める
      SMSG:=「取り消しそして、するとき、戻り、元のトランザクションの順序番号を渡します!'; 
      MyWriteLog(SMSG); 
      Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 
      出口; 
    END; 
  END; 
  IF StrToCurrDef(マネー、0)<= 0その後、
  開始
    SMSG:='負の許可量またはゼロ!'; 
    MyWriteLog(SMSG); 
    Application.MessageBox(PChar型(SMSG)、'「プロンプト、MB_OK); 
    出口; 
  END; 

  結果:=真; 
END;
 
関数PayIntf_Trans(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列; VARあるOrderNo:文字列):ブール;
  lv_nRet:整数; 
  InStr関数:文字列; 
  outStr:文字列; 
  SMSG:文字列; 
  resp_code:文字列; 
始める
  。* {1は、受信パラメータを検査:文書ルール
   固定長の文字列パラメータにまとめ* 2、
   * 3、メソッド呼び出しDLL 
   * 4は、解析が固定長文字列を返します。分析結果
   * 5を、ログイン
   *} 
   
  渡された引数チェック// 
  その後、未CheckDataValid(ParkCode、OptorCode、トランス、マネー、OldTrandID)のIF 
  を開始
    、終了し; 
  END; 

  //組成パラメータが渡されました固定長ストリングInStr関数を形成 
  IFないGetInputStr(ParkCode、OptorCode、トランス、マネー、OldTrandID、InStr関数)を
  開始し
    、終了を;
  END; 

  MyWriteLog( '送信固定長の文字列:[' + + InStr関数']'); 
  はsetLength(outStr、にSizeOf(TOutPutData)); 
  によってApplication.ProcessMessages; 
  lv_nRet:= BankTrans(PChar型(InStr関数)、PChar型(outStr)) ; // DLL BankTransメソッドの呼び出し 
  コピー(あるOrderNo ,. 1 ,. 8 IF )<>「EEEEEEEE」を//特別復帰時に、ネットワークの異常などの異常事態、
  ;によってApplication.ProcessMessages 
  ( '固定長の文字列を返す:[' outStr + + ']')MyWriteLog; 
  GetOutputData(outStr); 

  IF(lv_nRet <> 0)または(コピー(outStr ,. 1、2)<> '00' )その後、
  開始
    SMSG:=「トランザクションが失敗しました!'; 
    MyWriteLog(SMSG); 
    Application.MessageBox(PChar型(SMSG)、'「プロンプト、MB_OK); 
    出口; 
  END; 

  あるOrderNo:=トリム(コピー(あるOrderNo、158、50)); 
  //開始対話は同じ時間DLLでポップアップ表示されますボックス。商人の銀行とタイムリーなリターンの成功のことを確認してください!
    SMSG:=「取引成功!'; 
    MyWriteLog(SMSG +' [ 'あるOrderNo + +'] '); 
    Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 
  他のエンド
  始める
    SMSG:='トランザクションは、手動でモノをチェックする必要が成功しました!" ; 
    MyWriteLog(SMSG + '[' +あるOrderNo + ']')。 
    Application.MessageBox(PChar型(SMSG)、'「プロンプト、MB_OK); 
  終了; 
  
END; 

機能GetInputStr(ParkCode、OptorCode、トランス、マネー、OldTrandID:文字列; VARのInStr関数:文字列):ブール; 
VARの
  OLD_DATE、old_reference、old_trace、SMSG:文字列; 
  入力データ:TInputData; 
開始
  {貿易の説明:
            コンシューマー:受信必要な情報(トランザクションタイプ、量)が
            戻り値:受信に必要な情報(取引の種類、元のトランザクションの参照番号は、元の取引日量)
            失効:受信に必要な情報(取引の種類、量、元のシリアル番号)
            よりも多くをチェックします:受信に必要な情報(トランザクションのタイプ)
            注意:カードの残高の操作量は、パスワードのキーパッドに表示されている参照してください。そして、対応するバランスを返しません。
            再印刷:受信に必要な情報(取引の種類、元のシリアル番号)
            注:トランザクションに元のシリアル番号を再印刷:「000000」
            記号:受信に必要な情報(トランザクションのタイプ)
            課金:受信に必要な情報(トランザクションの種類)} 
  結果:= falseは、
  してみてください
    FillChar(入力データ、にSizeOf(TInputData)、」「); 
    FillArrayChar( 'RN'、ParkCode、InputData.posid)。
    FillArrayChar( 'RN'、OptorCode、InputData.operid)。
    FillArrayChar( 'R0'、トランス、InputData.trans)。
    FillArrayChar( 'L0'、IntToStr(TRUNC(StrToCurrDef(マネー、0)* 100))、InputData.amount)。

    (トランス= '01')の場合または(トランス= '02')、その後// '00'消费'01'撤销'02'退货'03'查余
    始め
      トランス= '01'であれば、次に
      開始
        FillArrayChar( 'L0'、old_trace、InputData.old_trace)。
      そうでない場合はGetOldTradeInfo(OldTrandID、OLD_DATE、old_reference、old_trace)を
      開始し
        、終了を。
      終わり; 

        FillArrayChar( 'RN'、 ''、InputData.old_date)。
        FillArrayChar( 'RN'、 ''、InputData.old_reference)。
      終わり; 
      トランス= '02'であれば、次に
      開始
        FillArrayChar( 'L0'、 ''、InputData.old_trace)。
        FillArrayChar( 'RN'、OLD_DATE、InputData.old_date)。// / *原交易日期(8字节、YYYYMMDD格式、隔日退货时用)* / 
        FillArrayChar( 'RN'、old_reference、InputData.old_reference)。// / *原交易参考号* / 
      終了。 
      FillArrayChar( 'RN'、 ''、InputData.old_date); 
      FillArrayChar( 'RN'、 ''、InputData.old_reference); 
    エンド;

    //以下はデフォルトの塗りつぶしです
    FillArrayChar( 'RN'、 '' 、InputData.old_batch); // / * 57〜62 伊原バッチ番号* / 
    FillArrayChar( 'RN'、 ''、InputData.old_auth); // /〜* 63は68ビットです元認証コード* / 
    FillArrayChar( 'RN'、 ''、InputData.old_terno); // / 76 * 69〜伊原トランザクション端末番号* / 
    FillArrayChar( 'RN'、 ''、InputData.szFenqiNum); // / *段階77〜78 * 03,06,09,12,18,24,36,42,48,60 /数
    FillArrayChar( 'RN'、 ''、InputData.szServiceNum); // / *ビット79〜80人々の数は、* /楽しむ
    '; FillArrayChar( 'RN'、' // / * 81〜92のデジタル商品アイテムコード* /、InputData.szGoodsNo) 
    FillArrayChar( 'RN ''」、InputData.trk2); // / * 2つのトラックデータ(37のバイトは、スペースの不足を補完し、左詰め)* /
    (RN ' ''、InputData.trk3)FillArrayCharを'; // / * 3つのトラックデータ(左詰めに104バイト、スペースの不足を補完する)* / 
    FillArrayChar( 'RN'、 ''、InputData.lrc)。// / *チェックデータトランザクション* /(0 9から3つのランダムな文字列) 
    はありません// 2015年6月16日に水を追加銀(注文); FillArrayChar( 'RN'、 ''、InputData.szOrderTrace) 以下の場合はスペースを残しました文字列); 
ました

      出口;
    END; 
  END; 
END; 
    始まります

  SMSG、STEMP:文字列; 
  出力データ:TOutPutData; 
始める
  試みを
    IF outStr =「」そして
    始まる
      SMSGを:=「トランザクションは、パラメータが空で返します!'; 
      MyWriteLog(SMSG); 
      Application.MessageBox(PChar型(SMSG)、'プロンプト'MB_OK); 
      出口; 
    END; 

    //記録に割り当てられた文字列
    FillChar(出力データ、にSizeOf(TOutputData)、'「); 
    StrLCopy(@出力データ、PChar型(outStr)、にSizeOf(TOutputData)); 

    //は、情報を記録するには、返された
    STEMPを:= '情報を返す[JSONに変換]:' + Obj2Json_OutputData(出力データ); 
    MyWriteLog(STEMP); 
  以外
    E ON:例外が行う
      SMSG:= '转换返回参数异常:' + e.message。
      MyWriteLog(SMSG)。
      Application.MessageBox(PChar型(SMSG)、 '提示'、MB_OK); 
      出口; 
    終わり; 
  終わり; 
終わり; 

機能Obj2Json_InputData(入力データ:TInputData):文字列。
始める
  の検索結果を:= '{'; 
  結果:= ' "は、POSID" +結果: "' +トリム(InputData.posid)+ '"、'; 
  結果:= ' "はoperid" +結果: "' +トリム(InputData.operid)+ '"、'; 
  結果: ': "+トリム(InputData.trans)+ '"、'; =は+ "トランス"'結果 
  結果:=は+結果' "量": "' +トリム(InputData.amount)+ '"、'; 
  結果:=結果+ ' "OLD_DATE": "」+トリム(InputData.old_date)+ '」、'; 
  結果:=結果+ ' "old_reference":'、 " '+(InputData.old_reference)+トリム"';
  結果:=結果+ ' "old_trace": "' +(InputData.old_trace)+トリム" ''; 
  結果: ': "+トリム(InputData.old_batch)+ '"、'; =は+ "old_batch"'結果
  結果: ': "+トリム(InputData.old_auth)+ '"、'; =は+ "old_auth"'結果 
  結果:=結果+ ' "old_terno": "' +(InputData.old_terno)+トリム" ''; 
  結果:=結果+ ' "szFenqiNum": "' +(InputData.szFenqiNum)+トリム" ''; 
  結果:=結果+ ' "szServiceNum": "' +(InputData.szServiceNum)+トリム" ''; 
  結果:=結果+ ' "szGoodsNo": "' +(InputData.szGoodsNo)+トリム" ''; 
  結果:= ' "は、TRK2" +結果: "' +トリム(InputData.trk2)+ '"、'; 
  結果:
  結果:=結果+ ' "LRC": "' +(InputData.lrc)+トリム" ''; 
  結果:=結果+ ' "szOrderTrace":'、 " '+(InputData.szOrderTrace)+トリム"';
  結果:=結果+ ' "szPrefer": "' +(InputData.szPrefer)+トリム" ''; 
  結果:=結果+ ' "szRsv": "' +(InputData.szRsv)+トリム'"';
  結果:=結果+ '}'; 
終わり; 

機能Obj2Json_OutputData(出力データ:TOutputData):文字列。
始める
  の検索結果を:= '{'; 
  結果:= ' "はresp_code" +結果: "' +トリム(OutputData.resp_code)+ '"、'; 
  結果:= ' "はbank_code" +結果: "' +トリム(OutputData.bank_code)+ '"、'; 
  結果:=結果+ ' "card_no": "' +(OutputData.card_no)+トリム" ''; 
  結果:= ' "は、式expr" +結果: "' +トリム(OutputData.expr)+ '"、'; 
  結果:=結果+ ' "量": "' +(出力データをトリム。
  結果:= ' "は、AUTH" +結果: "' +トリム(OutputData.auth)+ '"、'; : "」+トリム(OutputData.trans)+ '」、'; 
  結果:=結果+ '}';
  結果:= 'を"日付" +結果: "' +トリム(OutputData.date)+ '"、'; 
  結果:=結果+ ' "userno": "' +(OutputData.userno)+トリム" ''; 
  結果:=結果+ ' "terno": "' +(OutputData.terno)+トリム" ''; 
  結果:=結果+ ' "old_terno": "' +(OutputData.old_terno)+トリム" ''; 
  結果:=結果+ ' "resp_chin": "' +(OutputData.resp_chin)+トリム" ''; 
  結果:=結果+ ' "あるOrderNo": "' +(OutputData.OrderNo)+トリム" ''; 
  結果: ': "+トリム(OutputData.trans)+ '"、'; =は+ "トランス"'結果 
  結果:=結果+「」

機能GetOldTradeInfo(OldTrandID:文字列; VARのOLD_DATE、old_reference、old_trace:文字列):ブール; 
VARの
  SMSG:文字列; 
始める
  の検索結果を:= falseは、
  試してください
    OLD_DATE:= '20、190805' ; 
    old_reference:= '123,456,789,987,456'; 
    old_trace:=「123456 '; 

    結果:=真; 
  除く
    E ON:例外はない
    始める
      SMSGを:='異常な取得元のトランザクションの支払情報[元のトランザクション数を: '+ + OldTrandID']:「+ e.message; 
      MyWriteLog(SMSG); 
      Application.MessageBox (PChar型(SMSG)、 'プロンプト'、MB_OK); 
      出口; 
    END; 
  END; 
END;

手順FillArrayChar(FillType、ParamVaule:文字列; VARのArrVaule:文字の配列)。
    コピー(FillType、1、1)= 'L'ならば、//左填充
    開始
VaRの
  I、レン、差分:整数; 
  STEMP:文字列。
開始
  レンを:=長さ(ArrVaule)。
  長さ(ParamVaule)<レンは、次いで場合
  始まる
    差分を:=レン-長さ(ParamVaule)。
    差分= 1〜ん:私のために
    始め
      コピー(FillType、2、1)= '0'を//填充"0"があれば
      始める
        STEMPは:= STEMPは+ '0'; 
      終了
      始める
        STEMP:= STEMP + '「; //填充空格
      終了。
    終わり; 

      STEMP:= STEMP + ParamVaule。
    最後
    のコピー(FillType、1、1)= 'R'を//右填充あれば、他の
    開始
      STEMPを:= ParamVaule + STEMP。
    終わり; 
  他に終わる
  始め
    STEMP:= ParamVauleを。
  終わり; 

  用I:=レン1〜ん
  開始
    ArrVaule [I - 1]:= STEMP [I]; 
  終わり; 
終わり; 

手順MyWriteLog(constのMSTR:文字列); 
VaRの
  F:テキストファイル。
  myDirに、myFileName:文字列。
  ファイルハンドル:整数; 
  LOGTYPE、LOGDATE、ModuleIDは:文字列。
開始
  LOGTYPE:= 'INFOを'; 
  LOGDATE:= FormatDateTime( 'YYYY-MM-DD HH:NN:SSのZZZ'、今)。
  ModuleIDは:= ''; 
//そうでない場合(FLogFlagsでCanLogFile)[終了; 
  // ------文書の部品を実装するために書かれた-始め
  myDirに:= ExtractFilePath(ParamStr(0)); 
  //ファイル名を決定 
    のwriteln(F '$$' +フォーマット( '%6S'、[LOGTYPE])+「$ $ '+形式( '%の12S' [ModuleIDは])+ '$$' + LOGDATE + CHR(9)+ MSTR)。
    フラッシュ(F); 
    ; CLOSEFILEは、(F)
    // -----の一部を形成書面実装-の終わり
  のtry文は... // ...除い除い
  終わり; //除いて...してみてください...ステートメントが
終了し、

終了。

  

おすすめ

転載: www.cnblogs.com/studycode/p/11344638.html
おすすめ