Byte型2次元配列のパラメータの渡し方

解決


ezra  2018-01-06 17:00:12  No: 48912  IP: 192.*.*.*

すいません..もうひとつ教えてください。

パラメータとして伝票番号をわたして、その伝票の明細を取得する(outRespの構造体にセットされます。)関数GetCustomFileがあります。
その伝票番号をByte型の2次元配列で指定するようになっているのですが、例えば伝票番号「00004」を指定したいときはどのように書けばよいのでしょうか?

どうかご助言をよろしくお願い致します。


///// 元とのC++で書かれたコード ///////////////////////////////////////////////////////////////////////

typedef struct _OES_CUST_KEYNO{
    BYTE values[20][6];
} CUST_KEYNO, *LPCUST_KEYNO;


long WINAPI GetCustomFile(LP_CUST_KEYNO lpKeyNumber, LPRESREADCUSTOM outResp);




///// Delphiで書いてみたコード /////////////////////////////////////////////////////////////////////////////


type
   LPCUST_KEYNO = ^CUST_KEYNO;
   CUST_KEYNO = record
     values: array[0..19,0..5] of Byte;
   end;

  function GetCustomFile_EX(lpKeyNumber: LPCUST_KEYNO; outResp: LPRESREADCUSTOM): LongInt; stdcall; external 'ABCIF.dll';

編集 削除
通りすがり  2018-01-07 01:42:37  No: 48913  IP: 192.*.*.*

前の質問の時に書き忘れましたが、環境も書かずに質問とな?

はともかくとして、valuesにはANSIのC文字列を入れるということだと思いますので、

type
  CUST_KEYNO = record
    values: array[0..19,0..5] of AnsiChar;
  end;

として、usesにAnsiStringsを追加して、

var
  Num: AnsiString;
  Cust: CUSTKEYNO;
begin
  Num := '00004';
  FillChar(Cust,SizeOf(Cust),0);
  AnsiSrings.StrPLCopy(Cust.values[0],Num,5);
  ... := GetCustomFile_EX(@Cust,...);

という感じかと。伝票番号がStringに入ってた場合は

  AnsiSrings.StrPLCopy(Cust.values[0],AnsiString(Num),5);

でしょうか。いずれにしても長さが超過してるときのチェックは要りますね。

編集 削除
通りすがり  2018-01-07 01:51:17  No: 48914  IP: 192.*.*.*

あ、

  AnsiSrings.StrPLCopy(@Cust.values[0],Num,5); 

とStrPLCopyの第1パラメータには@つけないといけないかも。

編集 削除
ezra  2018-01-07 09:38:53  No: 48915  IP: 192.*.*.*

>前の質問の時に書き忘れましたが、環境も書かずに質問とな? 

所作もわきまえず申し訳ありませんでした。以後気をつけます。
開発環境は、Windows7 PRO 64bit、Delphi XE5になります。

>はともかくとして、valuesにはANSIのC文字列を入れるということだと思いますので、

ご助言誠にありがとうございます。
教えていただいたように書いてみましたが関数を実行した際に「パラメータの異常値」エラーが返ってきます。
メーカーにも問い合わせつつもう少し調べてみます。

編集 削除
通りすがり  2018-01-07 10:29:47  No: 48916  IP: 192.*.*.*

エラーになりますか。このGetCustomFileを呼び出すC/C++のサンプルコードがあったらそれを提示してもらえませんか?

編集 削除
ezra  2018-01-07 11:16:41  No: 48917  IP: 192.*.*.*

すいません。私の方にミスがありました。

typedef struct _CUST_KEYNO{ 
    long count;          // ←  見落としておりました...
    BYTE values[20][6]; 
} CUST_KEYNO, *LPCUST_KEYNO; 


あまりスマートではありませんが以下のように修正したら動きました!
本当に、本当に感謝です。ありがとうございました。


type
   LPCUST_KEYNO = ^CUST_KEYNO;
   CUST_KEYNO = record
     count: LongInt;
     values: array[0..19,0..5] of AnsiChar;  //Byte;
   end;

function GetCustomFile_EX(lpKeyNumber: LPCUST_KEYNO; outResp: LPRESREADCUSTOM): LongInt; stdcall; external 'ABCIF.dll'; 

procedure TForm1.Button1Click(Sender: TObject);       //伝票明細呼び出し
var
  Cust: CUST_KEYNO;
  pCust: LPCUST_KEYNO;
  xOutResp: RESREADCUSTOM;
  Num: AnsiString;
  rslt: Integer;
  xFix:Byte;
begin
  Num := '00005';

  New(pCust);
  pCust^.count := 1;
  AnsiStrings.StrPLCopy(pCust.values[0],AnsiString(Num),5);

  FillChar(xOutResp,SizeOf(xOutResp),0);
  rslt := GetCustomFile(pCust, @xOutResp);

  xFix := xOutResp.readData.byCS;  //確認用

  Dispose(pCust);

end;

編集 削除