DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: a12315
今日帖子: 41
在线用户: 15
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 shamohu (shasha) ★☆☆☆☆ -
盒子活跃会员
2018/9/20 14:42:54
标题:
Delphi如何调用GFortran生产的动态库dll文件? 浏览:1130
加入我的收藏
楼主: 开发环境用CodeBlocks 17.12, Fortran编译是缺省自带的GFortran,简单测试两个数x,y相加返回z的dll,Project名字为“add_dll”:

subroutine my_add(x,y,z)
   z = x+y
end

编译得到了“add.dll.dll”文件。

Delphi 7调用:

procedure my_add(x,y: Double;var z: double); StdCall; External 'add_dll.dll';

按钮执行代码:
procedure TForm1.Button1Click(Sender: TObject);
var x, y, z: double;
begin
    x := StrToFloat(Edit3.text);
    y := StrToFloat(Edit4.text);
    my_add(x,y,z);
end;

Delphi编译没问题,已执行就出“无法定位程序输入点my_dll于动态链接库add_dll.dll上”。烦请有知道的告知下原因?该如何调用?
多谢了。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/9/20 15:39:01
1楼: dll 输入点 的名字,都是字符串,即便是 记事本都可以查看。
DELPHI 调用 DLL 都是 WINAPI,这个提示,明显就是微软提示的。
不满意?找微软。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 shamohu (shasha) ★☆☆☆☆ -
盒子活跃会员
2018/9/20 15:52:37
2楼: 谢谢回复。
只是还是不知道解决方法,是调用方法错了?还是其它哪儿代码不对?
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2018/9/20 17:12:38
3楼: Fortran没玩过,你确定你的这个my_add在Fortran中不需要做些什么就能直接导出到DLL吗?像Delphi中都需要export的。
建议你在Fortran中写好DLL后,先用Fortran测试一下,确保没问题,然后再用Delphi来调用。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 shamohu (shasha) ★☆☆☆☆ -
盒子活跃会员
2018/9/20 17:58:18
4楼: 谢谢楼上!参考:http://www.g95.org/g95_dll.shtml

A: This example produces a dll called ex.dll. Save the code below in file ex.f90.

subroutine ex(i) 
integer i 
i=i+1 
return 
end

Compile and generate the dll with the following commands:

g95 -c ex.f90
g95 -shared -mrtd -o ex.dll ex.o

GFortran似乎的确不需要特别的定义
----------------------------------------------
-
作者:
男 o594cql (秋) ★☆☆☆☆ -
普通会员
2018/9/20 18:45:23
5楼: 把DLL文件上传,用PE工具看一下有没有输出表就知道DLL有没有问题
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ★☆☆☆☆ -
普通会员
2018/9/21 13:30:35
6楼: 函数参数类型定义问题
----------------------------------------------
-
作者:
男 hdcopy (hdcopy) ★☆☆☆☆ -
普通会员
2018/9/21 13:31:32
7楼: procedure和function
----------------------------------------------
-
作者:
男 shamohu (shasha) ★☆☆☆☆ -
盒子活跃会员
2018/9/22 11:01:32
8楼: 谢谢楼上!
找到了一点问题:CodeBlocks用自带的GNU Fortran编译出的动态库输出函数都会自动添加应该下划线“_”,Delphi或其它程序调用时需加上“_”,比如0#的:
procedure my_add(x,y: Double;var z: double); StdCall; External 'add_dll.dll';
改成:
procedure my_add_(x,y: Double;var z: double); StdCall; External 'add_dll.dll';
改正后,“无法定位程序输入点my_dll于动态链接库add_dll.dll上”错误没有了,但是点击按钮具体执行时还是出错:
两段Fortran代码:
1:
subroutine my_add ( x, y, z)
  real ( kind = 8 ) x
  real ( kind = 8 ) y
  real ( kind = 8 ) z

  z = x + y
end subroutine

2:
subroutine my_add ( x, y, z)
  real ( kind = 8 ) x
  real ( kind = 8 ) y
  real ( kind = 8 ) z
  real ( kind = 8 ) t
  
  t = 1.0*x + 2.1*y
end subroutine

分别编译成dll文件,Delphi调用计算,第一段出错,无法计算返回值;第二段可以运行,当然没有任何返回值,也没意义。上面代码看从Delphi传递进来得x,y和z都不能被赋值计算,否则出错。不知哪儿的问题?谢谢解答。
----------------------------------------------
-
作者:
男 djhfwk (djhfwk) ▲▲▲▲▲ -
普通会员
2018/9/23 12:40:11
9楼: dll传上来啊

不然大家都靠猜么
----------------------------------------------
-
作者:
男 o594cql (秋) ★☆☆☆☆ -
普通会员
2018/9/23 13:45:12
10楼: 参数用简单的类型,然后调试一下
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS