DELPHI调用vc++DLL之灵异现象

 

DLL写了多个调用,在VC++中都是用__declspec(dllexport)默认的声明函数,在delphi中使用cdecl约定调用,其它几个调用都可正常使用,唯有一个,总是在调用结束后,程序即异常退出,而且调用过程中执行完全正常。

找了好久也没发现到底是什么原因,后来就想试试其它调用约定,就把这个函数加了了stdcall说明

 

这个是原来的的函数说明:bool setClockFreq(int flags,int gpu_clk,int mem_clk,int s_clk);

 

修改后的函数说明:bool __stdcall setClockFreq(int flags,int gpu_clk,int mem_clk,int s_clk);

(__declspec(dllexport)放在类名称前面了这里看不到)

 

delphi中的说明:

 

TsetClockFreq = function(flags:integer;gpu_clk:integer;mem_clk:integer;s_clk:integer):boolean;cdcel;

 

然后在delphi中也改成了stdcall,跟着是调试,结果在DLL的调试中发现一个怪异现象:

 

函数的四个参数的值delphi传入值为(3,700,1814,1400),但是dll中读到的值却是(700,

 

1814,1400,1635680),第一个参数值丢失,后面的值自动往前顶上,最后面自己跑出来一个;

 

看到问题没有解决,就先把程序恢复了原样,不甘心又跑了一下,居然全部通过没有异常退出,赶紧检查才发现原来vc++中已经恢复了原样,没有使用stdcall说明而是默认,但delphi的程序说明还是用stdcall的约定。

现在的情况是DLL中的函数全部是__declspec(dllexport)说明,没有加stdcall,delphi中setClockFreq用的是stdcall约定,其它的函数调用是cdecl约定

......

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值