c++调用DLL参数传递失败

movind 2008-03-24 05:47:44
我用C++编写程序调用一个FORTRAN编写的DLL文件,如果中间没有参数传递的话,可以正常运行,但是带参数调用的话就,参数的值无法改变,向高手求教,该如何解决,拜托拜托!!我用的是Visual Fortran 6和NetBeans 5.5!附上程序如下(中间没有参数传递的话可正常运行,现在是传址调用,改为引用调用也不行):
FORTRAN程序:
SUBROUTINE AVER[DLLEXPORT](AV)

IMPLICIT NONE

REAL AV
REAL A, B
READ *, A,B
AV = (A+B)/2
PRINT *, AV
END
C++程序:
#include <stdio.h>
#include <windows.h>

int main()
{
HINSTANCE hInst;
typedef void (*p)(double*);
p add;
double aver;
hInst = LoadLibrary("testDll.dll");
if(hInst == NULL) {
printf("Load dll error!\n");
return 0;
}
else {
printf("Load dll OK!\n");
add = (p)GetProcAddress(hInst, "AVER");
if(add == NULL) {
printf("Open dll function failed!\n");
return 0;
}
else {
printf("Open dll function OK!\n");
add(&aver);
printf("%f", aver);
}
}
FreeLibrary(hInst);
return 0;
}
...全文
139 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
movind 2008-05-16
  • 打赏
  • 举报
回复
fortran中的real类型对应的是C++中的float型,我开始把fortran中的real型赋值给了c++中的double型,由于数据长度不同,所以出现了问题,所以只需要把double改为float,问题就解决了。。
hityct1 2008-03-26
  • 打赏
  • 举报
回复
怎么搞定的?
michney 2008-03-25
  • 打赏
  • 举报
回复
另外,我记得还有什么调用规则,就是参数的进栈次序的约定。可能要考虑吧。
什么stdcall之类的。
===============================
对的,调用是应该考虑方式
lz查一下farcall, cdecl, stdcall什么的
hityct1 2008-03-25
  • 打赏
  • 举报
回复
另外,我记得还有什么调用规则,就是参数的进栈次序的约定。可能要考虑吧。
什么stdcall之类的。
movind 2008-03-25
  • 打赏
  • 举报
回复
AV就是参数,是C++调用时传进来的变量,最后得到的应该是两个数的平均数
hityct1 2008-03-25
  • 打赏
  • 举报
回复
我把Fortran的语法忘得差不多了。

这个函数:
SUBROUTINE AVER[DLLEXPORT](AV)

IMPLICIT NONE

REAL AV
REAL A, B
READ *, A,B
AV = (A+B)/2
PRINT *, AV
END

REAL AV 是不是个局部变量?而不是参数AV。你好像没有修改参数的值。
movind 2008-03-25
  • 打赏
  • 举报
回复
问题已搞定。。。
movind 2008-03-25
  • 打赏
  • 举报
回复
新发现,我把FORTRAN程序改为求两个整数的和,然后用C++向FORTRAN传递整型参数就可以成功
看来问题出在FORTRAN的REAL型变量和C++的DOUBLE型变量上,请高手帮忙分析一下,该如何解决
movind 2008-03-25
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <windows.h>

extern "C"{void _stdcall AVER(double& AV);}

int main() {
double a;
AVER(a);
printf("%f", a);
return 0;
}
这种方法已经试过不行了,效果一样!
movind 2008-03-25
  • 打赏
  • 举报
回复
void _stdcall(*Add)(double*);

这种方法也试过了,还是不行。。。跟现在的效果一样
还有什么好办法吗?能帮忙改一下这个程序吗?

相关推荐

本课程主要是针对ILRuntime设计一个独立的脚本热更新框,框架的优势:

1.将代码热更脱离Assetbundle资源热更,独立的部分更适用于各种不同的框架。
2.加快项目的逻辑更新,bug修复.(后期修bug,多数情况下并不用动到资源,只需要更新脚本代码,无需重走资源打包发布流程,大大提升效率)
3.提供热更模式和正常开发模式的快速切换接口,可以让队友像平常一样去开发.
4.不依赖市面上的任何AB框架,完全兼容市面上各种不同的AB框架.
5.重点:希望通过它,帮助你学习、了解ILRuntime真正在项目中的应用.

框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用热更新的代码逻辑.

1.Create hotfixdll接口
	将热更部分的代码 编译成dll
	生成dll版本配置(MD5)

2.更新对比接口
	本地跟服务器的dll进行版本对比
	
3.下载热更dll
	下载dll本身的文件
	下载版本记录文件
	
4.加载热更dll
	加载dll
	实例化:AppDomain
	初始化:
	注册跨域继承适配器
	注册委托适配器
	LitJson重定向
	调用性能优化(CLR绑定功能)
	调用热更接口Hotfix.HotfixApplication.Main 进入热更逻辑
	
5.ILMonoBehaviour
	用于监听组件的生命周期,实际是桥接(调用)热更的逻辑
	Awake
	Start
	Enable
	Update
	LateUpdate
	.......
	
6.添加其他常用的库
	DOTween
	LitJson
	Spine
	Google.Protobuf
	TextAnimation
	可以根据上面的方式,自行添加依赖的库...

 

发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-24 05:47
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下