根据群主大人的指点(网址:http://bbs.fcode.cn/forum.php?mo ... &page=1#pid6531),我成功地再现了他的代码。但是,当我编写我的代码时,却发生了奇怪的错误,如下:(1)最主要的错误是进入dll的子过程时提示“cpp_main.exe 中的 0x5d7005a9 (vlhm.dll) 处最可能的异常: 0xC0000005: 读取位置 0x00000021 时发生访问冲突
cpp_main.exe 中的 0x5d7005a9 (vlhm.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00000021 时发生访问冲突”。如图:
(2)非常“诡异”的是:群主给的代码,不会提示说要加“@8”,但我的代码,如果和示例代码一样,写成“subroutine vlhm( pfilename , lens ) Bind(C,Name="vlhm")”的话,却提示“无法解析”(可是我并没有改动示例代码啊...)。如图:
闲话少说,下面上代码!
(1)c++主程序的代码:
[Fortran] 纯文本查看 复制代码 #include "stdafx.h"
#include <stdio.h>
#include <string.h>
extern "C" {void _stdcall vlhm(char *,int); }
//extern "C" {void vlhm(char *,int); }
int _tmain(int argc, _TCHAR* argv[])
{
char *inputfile= "C:\\Users\\www\\Desktop\\31005700.tem";
//char *inputfile;
//char str[] = "C:\\Users\\www\\Desktop\\\\31005700.tem";
//inputfile=&str[0];
vlhm(inputfile,strlen(inputfile));
return 0;
}
(2)Fortran的DLL代码:
[Fortran] 纯文本查看 复制代码 subroutine vlhm( pfilename , lens ) Bind(C,Name="vlhm")
!!!subroutine vlhm(pfilename,lens) Bind(C,Name="vlhm@8")
!DEC$ ATTRIBUTES DLLEXPORT::vlhm
use ,Intrinsic::ISO_C_Binding
implicit none
type(C_PTR) , value :: pfilename !c++主程序中传递进来的“Inputfile”变量,是C语言的指针
integer::lens !传入的字符串长度
character(len=lens),pointer::filename !这是Fortran的字符串
call c_f_pointer( pfilename , filename ) !把c语言的指针转换成fortran字符串
write(*,*)filename
end subroutine
|