Fortran Coder

查看: 7764|回复: 3

[混编] QTcreator 调用vs2012编写的Fortran的DLL时无法加载的问题

[复制链接]

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
发表于 2021-6-2 17:15:01 | 显示全部楼层 |阅读模式
本帖最后由 紫雪封尘 于 2021-6-2 17:17 编辑

最近,利用QT调用Fortran 编写的DLL出现无法加载的问题,QT调用DLL代码如下:
QString filename,file_information;
   typedef void(*QTread_segy)(char* filename,char*file_information,int *nt,int* ntrace,int *dt,int *sgyformat,int,int);  
  QLibrary dll("Dllreadtest.dll");//加载DllREAD_NTRACE.dll;            
qDebug()<<222222;         
   filename=ui->LEsegy->text();//从文本行读取segy文件名         
   file_information=ui->lineEdit_trace->text();//从文本行读取存储segy信息的文件名
  if(dll.load())//当我的Fortran 程序里有open文件的函数,则在此处无法加载  
  {           
   qDebug()<<111111;     
   QTread_segy read_segy=(QTread_segy)dll.resolve("READ_SEGY");      
   int nt;      
   int dt;      
   int ntrace;        
   int sgyformat;     
  QByteArray ba = filename.toLocal8Bit();      
  QByteArray f_information = file_information.toLocal8Bit();   
  char*c=ba.data();     
  read_segy(c,f_information.data(),&nt,&ntrace,&dt,&sgyformat,ba.size(),f_information.size());//调用DLL  
  //把读到的信息输出到对应的文本行   
    ui->lineEdit_segformat->setText(QString::number(sgyformat));     
   ui->lineEdit_nt->setText(QString::number(nt));      
   ui->lineEdit_ntrace->setText(QString::number(ntrace));   
   ui->lineEdit_dt->setText(QString::number(dt));
}

我的Fortran 程序如下
subroutine READ_SEGY(filename,file_information,nt,ntrace,dt,sgyformat,filenamesize,file_information_size)

    implicit none
    !DEC$ATTRIBUTES DLLEXPORT::READ_SEGY
    integer,value::filenamesize,file_information_size!传递文件名大小
    character(len=filenamesize)::filename!输入文件名
    character(len=file_information_size)::file_information!sgy参数文件大小
    integer:: ios,mark_pos=1
    character(len=128):: iom='OK'
    integer*8::length
    Integer(kind=4)::tmp!中间变量
    integer*4::nt
    integer*4::dt
    integer*4  ntrace !ntrace是地震道数,nt是采样点数,dt是采样间隔
    integer(kind=4)::sgyformat!用于判别sgy文件类型| SgyFormat:0--IBM,1--IEEE,2--无卷头PC  
    integer(kind=2),dimension(1800):: REEL !3600字节
    integer(kind=2),dimension(120):: HEAD  !240字节   
    NT=11;
    DT=10;
    NTRACE=12;
    sgyformat=1;  open(unit=11,file="file.txt")
    write(11,*)"采样点数","=",nt
    write(11,*) "地震道数","=",ntrace
    write(11,*)"采样间隔","=",dt
    write(11,*)'segy类型编号,0--工作站,1--微机,2--无卷头P微机 ,编号为:',sgyFormat
    close(11)

   end subroutine READ_SEGY
!!!!!!因为有此处操作导致load无法成功,我想知道为什么?请大佬们指教

953

帖子

0

主题

0

精华

大师

F 币
180 元
贡献
73 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
发表于 2021-6-2 21:06:32 | 显示全部楼层
可能是这个原因:
http://dlllose.w.fcode.cn/

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
 楼主| 发表于 2021-6-2 21:13:34 | 显示全部楼层
vvt 发表于 2021-6-2 21:06
可能是这个原因:
http://dlllose.w.fcode.cn/

谢谢,太强了,实在是太强了

25

帖子

10

主题

0

精华

熟手

F 币
158 元
贡献
82 点
 楼主| 发表于 2021-6-2 21:14:10 | 显示全部楼层
vvt 发表于 2021-6-2 21:06
可能是这个原因:
http://dlllose.w.fcode.cn/

谢谢老师,真的学到了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-29 10:22

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表