zoukankan      html  css  js  c++  java
  • 在C++ Builder中调用FORTRAN生成的DLL

    1.        Fortran中的函数定义形式

           subroutine add1[dllexport](p1,p2,p3)

           p3=p1+p2

           end subroutine add1

     

    2.        DLL中函数名的检查

    Tdump.exe检查*.dll文件,得到DLL文件中的函数名,例如:

           _ADD1@12

     

    3.        Borland C++ Builder中调用DLL

    两种方式:静态引入,动态引入,或者称为隐式连接(implicit linked),显示连接(explicit linked)

    使用显示连接的方法是使用WindowsAPI(LoadLibrary函数)来载入DLL,用FreeLibrary函数来释放DLL,用GetProcAddress来取得函数的地址,再呼叫该函数,使用之后释放。使用显示连接的优点在于,你可以完全控制该DLL的载入和释放,最有效地利用系统资源。在调用失败时,程序可以继续运行,进行处理。

     隐式连接的方法是通过project/add to project Dll.LIB加入到工程文件中,这种方法需要代码少,但是占用系统资源多。

     

    4.        显示连接的方法

    首先,在C++ Builder中,如Lib.h文件中声明函数:

           void _stdcall(*Add1)(float*,float*,float*);

    然后,在程序中调用DLL文件,例如Lib.DLL

    HINSTANCE hInst;

    hInst=LoadLibrary("TestFor1.Dll");

    if(NULL==hInst) Output("Load Dll Error!");

    else

    {

    Output("Load Dll Ok!");

    (FARPROC&)Add1=GetProcAddress(hInst,"_ADD1@12");

    if(Add1==NULL)

    {

    Output("Open Dll Function Failed!");

    }

    else

    {

    Output("Open Dll Function Ok!");

    }

    }

     

    5.        调用函数的方法

    例程如下:

    float p1,p2,p3;

    p1=1.0;

    p2=2.0;

    p3=0.0;

    AnsiString s;

    Add1(&p1,&p2,&p3);

    s=FormatFloat("0.0",p3);

    Output("计算结果:"+s);

  • 相关阅读:
    OC-内存管理-基本原理与引用计数器
    OC-改错题
    OC-Q&A
    OC-SEL
    CO-类的本质、description方法
    Tomcat 下 mysql的连接池配置和使用
    转:JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
    使应用程序常驻内存,不能被任务管理器关闭之配置文件设置
    解决Tomcat catalina.out 不断成长导致档案过大的问题
    >/dev/null 2>&1的含义
  • 原文地址:https://www.cnblogs.com/Ja/p/132780.html
Copyright © 2011-2022 走看看