有一c++写的dll: A.dll
c++声明:
int Test1(int * h):int;
函数的功能是创建一个句柄
delphi声明:
function Test1(var h: Integer): Integer; stdcall; external 'A.dll' ;用delphi做exe调用,返回值是错误的但是用c#做成exe调用这个函数,成功用c#再封装这个函数成com,再由delphi或者vc++调用也不行用delphi或vc++再封装由c#调用,函数返回值是对的其他函数只要是涉及指针的,2个参数的都能返回正确,就这一个参数的有这个问题。
为什么???
c++声明:
int Test1(int * h):int;
函数的功能是创建一个句柄
delphi声明:
function Test1(var h: Integer): Integer; stdcall; external 'A.dll' ;用delphi做exe调用,返回值是错误的但是用c#做成exe调用这个函数,成功用c#再封装这个函数成com,再由delphi或者vc++调用也不行用delphi或vc++再封装由c#调用,函数返回值是对的其他函数只要是涉及指针的,2个参数的都能返回正确,就这一个参数的有这个问题。
为什么???
才是你定义的那种样式
是不是这方面的原因?
function Test1(h: PInteger): Integer; stdcall; external 'A.dll'
C++ 默认是cdecl方式调用的
function Test1(var h: PInteger): Integer; stdcall; external 'A.dll'
刚刚少写了var显式调用和隐式调用都一样stdcall, cdecl,safecall什么都用过了
奇怪的就是只有宿主程序是c#的就可以难道这个托管的与非托管的问题ida调试到里面去,有地方竟然报float pointer by zero 字样的错误。
pascal 用堆栈传递,从左到右,栈内参数结束后自已清除
cdecl 用堆栈传递从右到左,调用程序负责清除堆栈
stdcall 同cdecl,如果做DLL,建议用stdcall,windows的程序都这样。
safecall 最安全也是最慢的,增加了很多代吗,可能调试用的。
网上找到的,你可以参考一下
另外,如果是cdecl和stdcall的问题的话,返回值不会有错,只是stack被破坏了而已,如果是程序直接挂掉才是它的毛病
function Test1(var h: Integer): Integer stdcall;
要么是
function Test1(h: PInteger): Integer stdcall;俩都用不错就怪了
[DllImportAttribute("A.dll")]
private static extern Int32 Test1(ref Int32 h);
cdecl方式调用失败(异常 )
stdcall调用函数返回值不对
这个文件中的其他函数都是stdcall的调用,都能成功,其他函数只要是涉及指针的,2个参数的都能返回正确,就这一个参数的有这个问题。