以下のような入力値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
初心者の質問で申し訳ありませんが、よろしくお願いします。
以下のように宣言して実行してみましたが、
モジュール'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;
すみません、実行部に書き間違いがありました、こちらです。
実行部
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の作り方の問題のような気がします。。。
私なら、保存先のポインタとサイズを引数に渡しますけど。。。
読み込み先のポインタとサイズもでしたね。
編集 削除DLL ではなく,まず,同じユニット内 (あるいは別のユニット内) の関数を作成
してテストしてみてはどうでしょうか.
引数が 1 つでも 2 つ以上でも手順は同じだと思いますから,
まず,引数が 1 つの場合をテストしてみてはどうでしょうか.
以下のようにポインターで引数を受け渡したところ無事動作しました。
ありがとうございました。
宣言部
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;
> DLL ではなく,まず,同じユニット内 (あるいは別のユニット内) の関数を作成
> してテストしてみてはどうでしょうか.
> 引数が 1 つでも 2 つ以上でも手順は同じだと思いますから,
> まず,引数が 1 つの場合をテストしてみてはどうでしょうか.
大変失礼しました.
これは C あるいは C++ で作成した DLL 内の関数を使用する場合なんですね.
「複数の結果」あるいは「引数が複数」の問題ではなく
「引数の型」の問題ということになります.
いい例だと思いましたので記事にしておきました.
[ Windows API ( C, C++ ) の関数の配列の引数はポインタ型 ]
http://mrxray.on.coocan.jp/Delphi/Others/TypeArray.htm#12
> [ Windows API ( C, C++ ) の関数の配列の引数はポインタ型 ]
ページの構成変更に伴い以下に移動しました.
http://mrxray.on.coocan.jp/Delphi/Others/Array_Message.htm#05