问题有2个:
1. typedef void(*QTsub)(QString b); 应该为 typedef void(*QTsub)(char*);
因为 ba.data() 的返回值就是 char* , 只有这种原生的类型才能混编。
你不能把 QString 传进来,fortran不能解析它。
2. Fortran的虚参没有定义长度,这样就算传进来,也只得到第一个字符“h”
实际上,你这种混编方式非常不规范。(换个编译器可能就不行了)
你可以考虑换一个方式:
[Fortran] 纯文本查看 复制代码 SUBROUTINE SUB(pc,n) Bind(C,Name="sub")
!DEC$ ATTRIBUTES DLLEXPORT::SUB
use , intrinsic :: ISO_C_Binding
integer , value :: n
type(c_ptr) , value :: pc
character(len=n) , pointer :: c
call c_f_pointer( pc , c )
write(*,*) c
END SUBROUTINE SUB
[C++] 纯文本查看 复制代码 #include "main.h"
#include <QLibrary>
extern "C" {
typedef void(*QTsub)(char*, int);
}
int main() {
QString a;
QLibrary dll("DLL2.dll");
if (dll.load()) {
QTsub sub = (QTsub)dll.resolve("sub");
a = "hello, World";
QByteArray ba = a.toLocal8Bit();
sub(ba.data(),ba.size());
}
} |