DLL中有函数int   Login(unsigned   char   ucLoginMode,   char   cFlag);返回成功后的Socket描述符tSocket     Login成功后使用int   SendActiveTest(int   tSocket);函数发送链路检测信号; 
我用以下声明: 
      function   Login(ucLoginMode:byte;cFlag   :byte       ):integer;   stdcall;   external   'SpApiDLL.dll'; 
      function   SendActiveTest(tSocket:integer):integer;stdcall;   external   'SpApiDLL.dll'; 在运行时Login正常返回Socket值,但SendActiveTest(Login(0,1))后返回发送连接测试包失败的错误码 
同样的方式在VB下运行正常。 百思不得其解!使用所有的Int型进行了测试,还是不行!都快郁闷死了…… 
也不知道大家有没有遇到这种情况的? 

解决方案 »

  1.   


    函数的声明要跟dll中的类型一致
    delphi 中的数据类型要求比较严格,vb有时候可以在类型上兼容,但delphi 不行。
    请详细检查数据类型是否一致。
      

  2.   

    用个变量保存Login函数的返回值, 并在调用SendActivetest函数时作为自变量。var
      iSocket: Integer;
    begin
      iSocket := Login(0, 1);
      if iSocket > 0 then SendActiveTest(iSocket);
    end;
      

  3.   

    SendActiveTest(iSocket);
    这种方式效果一样的。
      

  4.   

    根据报错信息来看,错误出在dll,而不是delphi中
    你试着编译一下delphi程序,看能否通过,如果通过就说明dll有问题
      

  5.   

    当然是可是编译,也能运行,就是返回值永远不成功!
    错误也不是出在DLL中,是VC写的DLL和Delphi的变量类型不匹配上,但现在拿不到DLL的源代码,只能让Delphi适应DLL
    而VB和VC同出一门,在变量的内存占用形式上一致,所以能通过!
    唉!难不成让我再去学VB?
      

  6.   

    对于DLL的调用,不存在开发语言,或使用语言的问题,问题还是出在你的调用上。
      

  7.   

    原型中定义的是stdcall方式吗?检查一下是stdcall还是cdecl
      

  8.   

    seleron说的不对啊,调用函数dll之后返回错误值,不能说明问题就出在那个动态库上面,一个简单的例子,比如人dll要求你调用函数的时候,变量的值有一个范围,但是你输入一个超出范围的数字,那还是会返回错误值的啊。而且程序能编译过,但是调用dll不能成功的事情实在是太多了,能编译过不能代表任何问题
      

  9.   

    问题没解决,换成用VB写没问题,只好换成VB来写这个接口,用DELPHI来写系统。
    在接下来的开发中又遇到了一个问题,用DELPHI来作SOAP开发,也是调用后返回值异常,同样的参数通过C#
    传入就没任何问题,不得不改用idHTTP来继续,郁闷呀!
    唉!难道delphi的时代已经过去了?
    难不成真得放弃delphi?无奈,结贴中……