作者:dingchangs 发表时间:2009-3-28 2:29:00 楼主 SUBROUTINE ARRAYTEST(n,arr) $ATTRIBUTES DLLEXPORT :: ARRAYTEST REAL(KIND=4),ALLOCATABLE:: XXX(:) INTEGER n,i,j REAL(4) arr(3,3) DO i=1,3 DO j=1,3 arr(i,j)=(n+2)*i+j !CALL CALARR(I,J,ARR(I,J)) END DO END DO n=n+10 ALLOCATE( XXX(10)) !这句话执行出错!!!!!!!!!!!! END SUBROUTINE 生成DLL没有问题但是却在VC++调用时出问题,请大家给予帮忙 VC++ 调用代码如下: HINSTANCE hIns=NULL; hIns = LoadLibraryEx("EXAM.dll",NULL,DONT_RESOLVE_DLL_REFERENCES); if(hIns) { typedef int (*MYPROC)(int &a, float b[3][3]); MYPROC fun= (MYPROC)GetProcAddress(hIns,"_ARRAYTEST@8"); float arr[3][3]; int a = 10; fun(a,arr); CString str; str.Format("%.3f",arr[1][1]); MessageBox(str); } else { AfxMessageBox("没有找到Exam.dll"); } 作者:臭石头雪球 发表时间:2009-3-29 15:20:00 第1楼 此问题已在 QQ 上解决。为了让其他网友借鉴,在此再说明一下。 Fortran 书写的 DLL,如果使用了一些系统功能,比如 Allocate 或者 Open 等,这些会使用到编译器提供的 Run-time 库。这些 Run-time 库会依赖其他系统的或编译器提供的函数库。并且在 DllEntry 入口函数中有必要的初始化代码。 因为这两个原因,我们在 LoadLibraryEx 加载 DLL 时,就不能再使用 DONT_RESOLVE_DLL_REFERENCES 标签。否则系统将不加载其他依赖的模块,并且跳过 DllEntry 入口函数执行。会因此造成这些使用 Run-time 函数库的语句发生错误。 只要将 C++ 代码中的: hIns = LoadLibraryEx("EXAM.dll",NULL,DONT_RESOLVE_DLL_REFERENCES); 改为: hIns = LoadLibraryEx("EXAM.dll",NULL,0); 即可解决问题。