用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约定
......