使用delphi语言生成的dll

qq_21955687 2017-12-19 11:04:43
通过delphi生成的dll,其中一个方法返回一个single类型的数组。再通过JNA使用。但是在编写dll时,不知道怎么返回数组,网上的资源也不够详细。如果使用结构体,在java IDE上会报错,不支持的类型。之前没有学习过delphi,希望大家帮助一下。
uses
System.SysUtils,
System.Classes;

{$R *.res}
type
TArr2 = array[0..3] of single;
PArr2 = ^TArr2;
Function MyFunc(s:single):array[0..3] of single;
var arr:array[0..3] of single;
begin
//new(arr);
arr[0]:=s;
arr[1]:=s;
arr[2]:=s;
arr[3]:=s;
Result:= arr;
// dispose(arr);
end;
exports
MyFunc;
begin
end.
...全文
379 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_21955687 2017-12-20
  • 打赏
  • 举报
回复
引用 13 楼 hongss 的回复:
[quote=引用 11 楼 qq_21955687 的回复:] [quote=引用 9 楼 hongss 的回复:] 直接在DLL中用procedure,返回数组就行
procedure Get_Data(BaseAddr: Word;var Data: Array of Word;WaitTime: Integer);
procedure不是没有返回值么?[/quote] 不用返回值 可以这样用
//主程序定义一个数组
var
    n_Im: Array[1..6] of Word;

//程序中调用DLL函数
    Get_Data( $280, n_Im,  100 );
//这样就可以在数组中传递出数据,在后边使用
[/quote]早上决定放弃JNA了,改用delphi
hongss 2017-12-20
  • 打赏
  • 举报
回复
引用 11 楼 qq_21955687 的回复:
[quote=引用 9 楼 hongss 的回复:] 直接在DLL中用procedure,返回数组就行
procedure Get_Data(BaseAddr: Word;var Data: Array of Word;WaitTime: Integer);
procedure不是没有返回值么?[/quote] 不用返回值 可以这样用
//主程序定义一个数组
var
    n_Im: Array[1..6] of Word;

//程序中调用DLL函数
    Get_Data( $280, n_Im,  100 );
//这样就可以在数组中传递出数据,在后边使用
qq_21955687 2017-12-20
  • 打赏
  • 举报
回复
引用 10 楼 xiaocongzhi 的回复:
记得Java好像没有指针的,数组是有的,你直接out一个数组,试试java的数组能不能收到
我尝试过返回一个数组,但是delphi的代码写不来。貌似delphi 的Result不能是一个array of single
qq_21955687 2017-12-20
  • 打赏
  • 举报
回复
引用 9 楼 hongss 的回复:
直接在DLL中用procedure,返回数组就行
procedure Get_Data(BaseAddr: Word;var Data: Array of Word;WaitTime: Integer);
procedure不是没有返回值么?
xiaocongzhi 2017-12-20
  • 打赏
  • 举报
回复
记得Java好像没有指针的,数组是有的,你直接out一个数组,试试java的数组能不能收到
hongss 2017-12-20
  • 打赏
  • 举报
回复
直接在DLL中用procedure,返回数组就行
procedure Get_Data(BaseAddr: Word;var Data: Array of Word;WaitTime: Integer);
  • 打赏
  • 举报
回复
引用 8 楼 qq_21955687 的回复:
[quote=引用 7 楼 DelphiGuy 的回复:] [quote=引用 5 楼 qq_21955687 的回复:] [quote=引用 3 楼 DelphiGuy 的回复:] Function MyFunc(s:single):TArr2; begin result[0] := s; // ... end;
java中没有结构体,不支持[/quote] 那你只能从Java端传一个指针到Delphi函数,按照JNA文档,可以: Memory mem = new Memory(xxx); 然后Delphi端: procedure myproc(p: pointer; n: integer); // n是元素数量,也可以不传,保证预分配的内存足够大即可 var m: ^TArr2 absolute p; i: integer; begin for i := 0 to n - 1 do m[i] := xxx; end; [/quote]procedure是没有返回值的吧,怎么返回呢?而且Java里没有指针的。[/quote] 因为传入的mem(就是Delphi函数的参数p的实参)是在Java端分配的,Delphi函数只是向其中写数据。 Memory mem = new Memory(xxx);这样定义的mem传入原生函数就是指针。
Mr Dang 2017-12-19
  • 打赏
  • 举报
回复
Function MyFunc(pInData,pOutData:PAnsiChar):Boolean; 都通过PAnsiChar传递, 返回数组按照 1.0,2.1,3.5,4.6 以逗号分隔 或者其他符号分隔
qq_21955687 2017-12-19
  • 打赏
  • 举报
回复
引用 7 楼 DelphiGuy 的回复:
[quote=引用 5 楼 qq_21955687 的回复:] [quote=引用 3 楼 DelphiGuy 的回复:] Function MyFunc(s:single):TArr2; begin result[0] := s; // ... end;
java中没有结构体,不支持[/quote] 那你只能从Java端传一个指针到Delphi函数,按照JNA文档,可以: Memory mem = new Memory(xxx); 然后Delphi端: procedure myproc(p: pointer; n: integer); // n是元素数量,也可以不传,保证预分配的内存足够大即可 var m: ^TArr2 absolute p; i: integer; begin for i := 0 to n - 1 do m[i] := xxx; end; [/quote]procedure是没有返回值的吧,怎么返回呢?而且Java里没有指针的。
  • 打赏
  • 举报
回复
引用 5 楼 qq_21955687 的回复:
[quote=引用 3 楼 DelphiGuy 的回复:] Function MyFunc(s:single):TArr2; begin result[0] := s; // ... end;
java中没有结构体,不支持[/quote] 那你只能从Java端传一个指针到Delphi函数,按照JNA文档,可以: Memory mem = new Memory(xxx); 然后Delphi端: procedure myproc(p: pointer; n: integer); // n是元素数量,也可以不传,保证预分配的内存足够大即可 var m: ^TArr2 absolute p; i: integer; begin for i := 0 to n - 1 do m[i] := xxx; end;
qq_21955687 2017-12-19
  • 打赏
  • 举报
回复
引用 4 楼 leeky 的回复:
没用过java,但想来java也该支持结构体吧?想来问题的解决还得从java方面考虑。 就你的测试代码,不能写成如下形式么? Function MyFunc(s:single):TArr2; var arr:TArr2; begin arr[0]:=s; arr[1]:=s; arr[2]:=s; arr[3]:=s; Result:= arr; end; 另:二楼的意思是用pOutData:PAnsiChar作为返回。 才看到,楼上的兄弟已经给出相同的代码。 //================= 特别注意:虽然定义了TArr2 = array[0..3] of single; 但TArr2 与后面的 array[0..3] of single并不是同一个类型,即使两个array[0..3] of single也不是一个类型。
java中没有结构体,我试过用结构体返回,报错了
qq_21955687 2017-12-19
  • 打赏
  • 举报
回复
引用 3 楼 DelphiGuy 的回复:
Function MyFunc(s:single):TArr2; begin result[0] := s; // ... end;
java中没有结构体,不支持
leeky 2017-12-19
  • 打赏
  • 举报
回复
没用过java,但想来java也该支持结构体吧?想来问题的解决还得从java方面考虑。 就你的测试代码,不能写成如下形式么? Function MyFunc(s:single):TArr2; var arr:TArr2; begin arr[0]:=s; arr[1]:=s; arr[2]:=s; arr[3]:=s; Result:= arr; end; 另:二楼的意思是用pOutData:PAnsiChar作为返回。 才看到,楼上的兄弟已经给出相同的代码。 //================= 特别注意:虽然定义了TArr2 = array[0..3] of single; 但TArr2 与后面的 array[0..3] of single并不是同一个类型,即使两个array[0..3] of single也不是一个类型。
  • 打赏
  • 举报
回复
Function MyFunc(s:single):TArr2; begin result[0] := s; // ... end;
qq_21955687 2017-12-19
  • 打赏
  • 举报
回复
引用 1 楼 a295281315 的回复:
Function MyFunc(pInData,pOutData:PAnsiChar):Boolean; 都通过PAnsiChar传递, 返回数组按照 1.0,2.1,3.5,4.6 以逗号分隔 或者其他符号分隔
引用 1 楼 a295281315 的回复:
Function MyFunc(pInData,pOutData:PAnsiChar):Boolean; 都通过PAnsiChar传递, 返回数组按照 1.0,2.1,3.5,4.6 以逗号分隔 或者其他符号分隔
这个function的返回值不是boolean类型的么?

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧