有一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个参数的都能返回正确,就这一个参数的有这个问题。
为什么???

解决方案 »

  1.   

    int * h,是指针,不是直接的integer类型
      

  2.   

    int winapi Test1(int * h)
    才是你定义的那种样式 
      

  3.   

    Delphi显式调用和隐式调用都不行吗?
      

  4.   

    stdcall, cdecl??
    是不是这方面的原因?
    function Test1(h: PInteger):  Integer; stdcall; external 'A.dll' 
      

  5.   

    int Test1(int * h)
    C++ 默认是cdecl方式调用的
      

  6.   

    不好意思,我delphi 的声明是
    function Test1(var h: PInteger):  Integer; stdcall; external 'A.dll' 
    刚刚少写了var显式调用和隐式调用都一样stdcall, cdecl,safecall什么都用过了
      

  7.   

    PInteger,pointer什么都用了
    奇怪的就是只有宿主程序是c#的就可以难道这个托管的与非托管的问题ida调试到里面去,有地方竟然报float pointer by zero 字样的错误。
      

  8.   

    register   用寄存器传递参数   
      pascal   用堆栈传递,从左到右,栈内参数结束后自已清除   
      cdecl   用堆栈传递从右到左,调用程序负责清除堆栈   
      stdcall   同cdecl,如果做DLL,建议用stdcall,windows的程序都这样。   
      safecall   最安全也是最慢的,增加了很多代吗,可能调试用的。 
    网上找到的,你可以参考一下
      

  9.   

    写下你在c#中的声明吧,是 int Test1(ref int h) 么?
    另外,如果是cdecl和stdcall的问题的话,返回值不会有错,只是stack被破坏了而已,如果是程序直接挂掉才是它的毛病
      

  10.   

    delphi声明要么是
    function Test1(var h: Integer): Integer stdcall;
    要么是
    function Test1(h: PInteger): Integer stdcall;俩都用不错就怪了
      

  11.   

    c#:
            [DllImportAttribute("A.dll")]
            private static extern Int32 Test1(ref Int32 h);
    cdecl方式调用失败(异常 )
    stdcall调用函数返回值不对
    这个文件中的其他函数都是stdcall的调用,都能成功,其他函数只要是涉及指针的,2个参数的都能返回正确,就这一个参数的有这个问题。