VC中的源程序如下:
#include "stdio.h"
#include "windows.h"//#define fincr FINCR//extern "C" {float __stdcall fincr( float *x );}/* a function to return x+1 */void main()
{
  int i;
  float x = 0 ;  HINSTANCE hIns;
  hIns = LoadLibraryEx("FortranDLLC.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
  
  typedef  float (*MYPROC)(float &x); 
  MYPROC fun = (MYPROC)GetProcAddress(hIns,"_FINCR@8");  for ( i = 0 ; i < 5 ; i++ )
    { 
      printf("\n %f plus 1 = %f ", x, (*fun)( x ) );
      x = x + 1 ;
    }
  printf("\n");
  FreeLibrary(hIns); 
}fortran源程序如下:
!DEC $ATTRIBUTES DLLEXPORT :: FINCR
      real function fincr( x )
      real x
      fincr = x + 1 
      return
      end
fortran中生成dll在vc中调用,但是编译通过了,运行却出错!
是不是VC中还要一些调用dll的语句?
还望高手指教!先谢谢了!

解决方案 »

  1.   

    _FINCR@8
    动态库函数名称不叫这个吧?不是FINCR嘛
      

  2.   

    FINCR是dll中的函数名啊!
    @后面的数字是参数个数乘4,
    这儿我写错了!应该是4
      

  3.   

    FINCR就可以了吧。为什么写@4呢?不解
      

  4.   

    这个是从一个例子上拿过来的!
    那上面的文档说明如下:
    在vc中用LoadLibraryEx得到该模块的句柄,用GetProcAddress定位该函数的指针
    函数名称为_funname@number number为参数个数乘以4
      

  5.   

    关于在 VC 中调用 FORTRAN 的问题,有以下两点供参考: 
    一 、VC调用 FORTRAN 的方式 
    为便于编译和调试程序(尤其在 VC 和 FORTRAN 使用不同公司的编译器时),对于多语言编程的应用程序,通常以 DLL 来实现相互间的调用。可以把被调用的 FORTRAN 过程做到 DLL 中,并保证 C 与所调用的 FORTRAN 函数都具有相同的接口。 
    调用应采用动态加载(显式链接)方式。使用动态加载的应用程序必须使用 LoadLibrary() 函数加载 DLL 并得到一个模块句柄。然后使用该句柄调用 GetProcAddress() 函数获得所需调用的导出函数的指针,并通过该指针调用 DLL 中的导出函数。在使用完毕之后,还需调用 FreeLibrary() 函数释放加载的 DLL 。
    二、要注意的问题: 
    为使调用过程正确,在主程序中应注明被调用过程的属性为“ C”属性(extern "C")。同样,FORTRAN 过程的参数也都必须以 INTERFACE 语句指定各变元为“ C”属性(var_name [C])。 
    指定子过程和变元属性非常重要,因为 C 与 FORTRN 调用子过程时的参数入栈次序正好相反,指定相同的属性可保证调用时参数正确传递。此外,由于 C 通过传值方式传递参数,FORTRAN 则通过传址方式传递参数,对于大数据量的参数(如数组、结构变量)等,还需指定变量遗传址方式传递,以减小系统开销。好像没说要带参数啊
      

  6.   

    syy64(太平洋) 什么意思啊?
      

  7.   

    就是说我对这方面感兴趣,但从来没有用VC调过Fortran的DLL,以前有人提过这方面的帖子,好象没解决,我以前编过大量的fortran程序。
      

  8.   

    为什么用GetProcAddress定位的函数指针
    全是零啊?