本帖最后由 紫雪封尘 于 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无法成功,我想知道为什么?请大佬们指教
|