{看到一篇贴}主题:Fortran 生成的DLL中为何allocate用不了?

 
作者: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);
即可解决问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值