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

解決


ezra  2018-01-07 02:00:12  No: 48912

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

パラメータとして伝票番号をわたして、その伝票の明細を取得する(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 10:42:37  No: 48913

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

はともかくとして、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 10:51:17  No: 48914

あ、

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

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


ezra  2018-01-07 18:38:53  No: 48915

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

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

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

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


通りすがり  2018-01-07 19:29:47  No: 48916

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


ezra  2018-01-07 20:16:41  No: 48917

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

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;


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加