複数の結果を取得するDLLの使用方法

解決


manzo  2019-06-03 23:55:01  No: 49769

以下のような入力値1つに対して結果が複数返ってくるDLLを使用したいと思いますが、functionの宣言方法及びDLLの使用方法を教えて頂けないでしょうか?

test.dll

関数名
test_conv

構文  
test_conv(
  int   src[1000],
  float dst1[500],
  float dst2[500]
);

戻り値
 0=正常終了
 1=変換失敗

引数
  int[]     src   in
  float[]   dst1  Out
  float[]   dst2  Out

初心者の質問で申し訳ありませんが、よろしくお願いします。


manzo  2019-06-06 17:52:04  No: 49770

以下のように宣言して実行してみましたが、
モジュール'hoge.dll'のアドレス66C017C4でアドレス00003E80に対する書き込み違反がおきました。
となってしまい実行できません。どこがおかしいでしょうか?

宣言部
function test_conv(src:array of integer;var dst1:array of single;var dst2:array of single):boolean;stdcall;external 'hoge.dll';

実行部
procedure Ttest_Form.Button1Click(Sender: TObject);
var
  ret:boolean;
  src_dat:array[0..1000]of Integer;
  dst1_dat:array[0..500]of Single;
  dst2_dat:array[0..500]of Single;
  i:integer;
begin
  for i := 0 to 1000 do src_dat[i]:=1000;
  ret:=hbie_heartbeat_interval_estimate(src_dat,dst1_dat,dst2_dat);
  Label1.Caption:=BoolToStr(ret);
end;


manzo  2019-06-06 17:55:30  No: 49771

すみません、実行部に書き間違いがありました、こちらです。

実行部
procedure Ttest_Form.Button1Click(Sender: TObject);
var
  ret:boolean;
  src_dat:array[0..1000]of Integer;
  dst1_dat:array[0..500]of Single;
  dst2_dat:array[0..500]of Single;
  i:integer;
begin
  for i := 0 to 1000 do src_dat[i]:=1000;
  ret:=test_conv(src_dat,dst1_dat,dst2_dat);
  Label1.Caption:=BoolToStr(ret);
end;


DLLの使い方っていうか  2019-06-06 22:52:05  No: 49772

DLLの作り方の問題のような気がします。。。

私なら、保存先のポインタとサイズを引数に渡しますけど。。。


DLLの使い方っていうか  2019-06-07 01:28:30  No: 49773

読み込み先のポインタとサイズもでしたね。


Mr.XRAY  2019-06-07 04:46:19  No: 49774

DLL ではなく,まず,同じユニット内 (あるいは別のユニット内) の関数を作成
してテストしてみてはどうでしょうか.
引数が 1 つでも 2 つ以上でも手順は同じだと思いますから,
まず,引数が 1 つの場合をテストしてみてはどうでしょうか.


manzo  2019-06-08 02:13:08  No: 49775

以下のようにポインターで引数を受け渡したところ無事動作しました。
ありがとうございました。

宣言部 
function test_conv(src:pointer;dst1:pointer;dst2:pointer):boolean;stdcall;external 'hoge.dll'; 

実行部 
procedure Ttest_Form.Button1Click(Sender: TObject); 
var 
  ret:boolean; 
  src_dat:array[0..1000]of Integer; 
  dst1_dat:array[0..500]of Single; 
  dst2_dat:array[0..500]of Single; 
  i:integer; 
begin 
  for i := 0 to 1000 do src_dat[i]:=1000; 
  ret:=test_conv(@src_dat,@dst1_dat,@dst2_dat); 
  Label1.Caption:=BoolToStr(ret); 
end;


Mr.XRAY  2019-06-10 04:50:24  No: 49776

> DLL ではなく,まず,同じユニット内 (あるいは別のユニット内) の関数を作成 
> してテストしてみてはどうでしょうか. 
> 引数が 1 つでも 2 つ以上でも手順は同じだと思いますから, 
> まず,引数が 1 つの場合をテストしてみてはどうでしょうか. 

大変失礼しました.
これは C あるいは C++ で作成した DLL 内の関数を使用する場合なんですね.
「複数の結果」あるいは「引数が複数」の問題ではなく
「引数の型」の問題ということになります.

いい例だと思いましたので記事にしておきました.

[ Windows API ( C, C++ ) の関数の配列の引数はポインタ型 ]
http://mrxray.on.coocan.jp/Delphi/Others/TypeArray.htm#12


Mr.XRAY  2019-06-11 02:19:00  No: 49777

> [ Windows API ( C, C++ ) の関数の配列の引数はポインタ型 ] 

ページの構成変更に伴い以下に移動しました.
http://mrxray.on.coocan.jp/Delphi/Others/Array_Message.htm#05


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








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