1. 编译fortran函数为DLL,($ATTRIBUTES DLLEXPORT :: funname)标注为导出函数。
2. 在vc中用LoadLibraryEx得到该模块的句柄,用GetProcAddress定位该函数的指针
函数名称为_funname@number number为参数个数乘以4
3. 调用函数即可注意调用形式为_stdCall,传递指针。例如如果传递一个int 类型的参数要改为引用。在code generation改为_stdcall调用。
4. 注意函数指针的用法。
如:typedef int* Myproc(int n,int arr[3][3]);
Myproc = (MyProc) GetProcAddress()
参考文档:
Fortran 的DLL程序:
SUBROUTINE ARRAYTEST(n,arr)
$ATTRIBUTES DLLEXPORT :: ARRAYTEST
INTEGER n,i,j
REAL(4) arr(3,3)
DO i=1,3
DO j=1,3
arr(i,j)=10.1*i+j
END DO
END DO
n=n+10
END SUBROUTINE
VC中调用程序:
HINSTANCE hIns;
hIns = LoadLibraryEx("EXAM.dll",NULL,DONT_RESOLVE_DLL_REFERENCES);
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[2][2]);
MessageBox(str);
::FreeLibrary(hIns);