すいません..もうひとつ教えてください。
パラメータとして伝票番号をわたして、その伝票の明細を取得する(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';
前の質問の時に書き忘れましたが、環境も書かずに質問とな?
はともかくとして、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);
でしょうか。いずれにしても長さが超過してるときのチェックは要りますね。
あ、
AnsiSrings.StrPLCopy(@Cust.values[0],Num,5);
とStrPLCopyの第1パラメータには@つけないといけないかも。
>前の質問の時に書き忘れましたが、環境も書かずに質問とな?
所作もわきまえず申し訳ありませんでした。以後気をつけます。
開発環境は、Windows7 PRO 64bit、Delphi XE5になります。
>はともかくとして、valuesにはANSIのC文字列を入れるということだと思いますので、
ご助言誠にありがとうございます。
教えていただいたように書いてみましたが関数を実行した際に「パラメータの異常値」エラーが返ってきます。
メーカーにも問い合わせつつもう少し調べてみます。
エラーになりますか。このGetCustomFileを呼び出すC/C++のサンプルコードがあったらそれを提示してもらえませんか?
すいません。私の方にミスがありました。
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;
ツイート | ![]() |