int _stdcall EstablishConnect(char * IP_Address,int IP_Port,int TimeOut,unsigned int *Sock)
int _stdcall SMT_Read_Id_MacNo(unsigned int Sock,unsigned char id[5])

解决方案 »

  1.   

    char * IP_Address = IP_Address :Pchar
    int * = ^Integer;最好做一个PInteger = ^Integer;
    int * = PInteger
      

  2.   

    function EstablishConnect(IP_Address: PChar; IP_Port, TimeOut: Integer; Sock: PInteger): Integer;
      

  3.   

    谢谢楼上的,我试一下,还有如何调用呢?声明成PINTGER.
      

  4.   

    比较困惑的是如何取Sock的值?
      

  5.   

    int _stdcall EstablishConnect(char * IP_Address,int IP_Port,int TimeOut,unsigned int *Sock) 
    int _stdcall SMT_Read_Id_MacNo(unsigned int Sock,unsigned char id[5])
    function EstablishConnect(IP_Address: PAnsiChar; IP_Port: Integer; TimeOut: Integer; var Sock: LongWord): Integer; stdcall;
    function SMT_Read_Id_MacNo(Sock: LongWord;id: array[0..4] of Byte): Integer; stdcall;
      

  6.   


    Type
      TId=Array[0..4] of char;function SMT_Read_Id_MacNo(Sock: LongWrod; id: TId): Integer;

    function SMT_Read_Id_MacNo(Sock: LongWrod; id: PChar): Integer;(这种好像不大严格)最后别忘了加stdcall; external 'XXXX.dll';
      

  7.   

    非常感谢各位的帮助.可我的问题仍然存在.我是这样声明的.
    function EstablishConnect(IP_Address:pchar;IP_Port:Integer;TimeOut:Integer;Sock:pCardinal):Integer;stdcall;function SMT_Read_Id_MacNo(Sock:Cardinal;output:array of byte):Integer;stdcall;procedure TForm1.Button1Click(Sender: TObject);
    var
      nResult: Integer;
      sock:PCardinal;
      szid : array[0..4] of byte;
      szIp : string;
    begin
      szIp:='10.23.5.152';
        nResult := EstablishConnect(PChar(szIp),10001,1000,Sock);
        case nResult of
         0: begin
              hSock := sock^;
              bOpen := True;
            end;
         -7:showmessage('Timeout');
         -13: ShowMessage('Ip Error');
         -14: ShowMessage('socket init error');
        end;    if bOpen then
        begin
          nResult:=SMT_Read_Id_MacNo(hSock,szId);//********
          case  nResult of
           0: ;//ShowMessage(szid[0]);
           $07: ShowMessage('length error');
           $0b:ShowMessage('ime1 # error');
           -6: showmessage('no response');
          end;
        end;
    end;//********这部分老是返回失败的,我怀疑是返回的SOCK不对.再次谢谢大家.
      

  8.   

    EstablishConnect最好参考5楼的声明,否则的话使用方法不是象你那样使用的。sock参数是一个回写的参数,如果你没有提供相应的内存,而只是提供一个指针,那么这个写出就会访问到一个非法地址。
      

  9.   

    当然也可以改成:
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
      nResult: Integer; 
      sock:Cardinal; 
      szid : array[0..4] of byte; 
      szIp : string; 
    begin 
      szIp:='10.23.5.152'; 
        nResult := EstablishConnect(PChar(szIp),10001,1000,@Sock); 
      

  10.   

    第二个应该是
    function SMT_Read_Id_MacNo(Sock: Cardinal; id: PAnsiChar): Integer;
    Delphi不支持直接用固定数组做参数的语法
      

  11.   

    第一种写法也可以,不过从delphi的语义讲,最好在id前加上const/var/out中的一个,不然在使用delphi接口的人看来,会产生一种传入数组拷贝的错觉。虽然实际上传入的也还是指针,并且dll中也不会再生成一个拷贝
      

  12.   

    推荐的声明是:
    function SMT_Read_Id_MacNo(Sock: LongWord; const id): Integer; stdcall;
      

  13.   


    我赞同,但是我一直有个疑问,就是c里边额unsigned int 在Delphi里能用Longword表示吗?不会出现不兼容吗?
      

  14.   

    人家也没写DWORD,反正都默认x86的32位程序就没问题
      

  15.   

    只要是类型差不多就兼容了。比如在VB当中还没有无符号的32位整形,那么就只能用long来表示。数据字节对齐之后可以保证数据不会丢失即可,对于二进制数据只要字节数一样,并且字节序相同就不存在问题,等需要具体解释或运算的时候,那是解释/运算程序该做的事。比如在VB当中没有那么大的整数,则只能通过Currency转换,然后表达出来。