udpserver,udpclient 用delphi7 7封装在dll 里,udpserver 接受一个设备的udp数据,udpclient 发送数据到设备,
用xe 调用dll 接收数据正常,发送数据报av 00409D85 的内存错误,用delphi 7 调用这个dll 收发数据都正常,这是怎么回事,希望高手能解答下!

解决方案 »

  1.   


    library ZHPRReadCard;uses
      SysUtils,
      IdBaseComponent,
      IdComponent,
      IdUDPBase,
      IdUDPServer,
      IdUDPClient,
      System,
      IdSocketHandle,
      Dialogs,
      Windows,
      Messages,
      Classes;  type
      TClientClass = class  public
         IDUDPS: TIdUDPServer;
         sIDUDPS: TIdUDPClient;
        procedure IDUDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
        procedure openudp;
        procedure  closeudp;
        procedure StartReadCard;
        procedure Openontjdq;
        constructor Create;
        destructor Destroy; override;  end;
    var
     fhand:hwnd;
     fipaddress:string;
     fport:Integer;
     FClient:TClientClass;
    // myudp:TIdUDPServer;
     const   WM_YOURMSG=WM_USER+200;
    {$R *.res}
    function StrToHex(AStr: String):String;
    var
      i: Integer;
    begin
      result := '';
      for i := 1 to Length(AStr) do
        result := result + IntToHex(ord(AStr[i]), 2);
    end;function readinit(hand:hwnd;ipaddress:string;port:Integer):Boolean;stdcall;
    begin
      fhand:=hand;
      fipaddress:=ipaddress;
      fport:=port;
       if FClient = nil then
      begin
        FClient := TClientClass.Create;
        Result := True;
      end
      else
      begin
        Result := False;
      end;end;function OpenRead:Boolean;stdcall;
    begin
       if FClient<>nil then
       begin
        FClient.openudp;
        Result:=True;
       end
       else Result:=False;
    end;function CloseRead:Boolean;stdcall;
    begin
       if FClient<>nil then
       begin
        FClient.closeudp;
        Result:=True;
       end
       else Result:=False;
    end;function StareReadcard:Boolean;stdcall;
    begin
      if FClient<>nil then
      begin
        FClient.StartReadCard;
        Result:=True;
      end
      else Result:=False;
    end;function Openontjdq:Boolean;stdcall;
    begin
       if FClient<>nil then
      begin
        FClient.Openontjdq;
        Result:=True;
      end
      else Result:=False;
    end;
    exports
     OpenRead,
     closeread,
     StareReadcard,
     Openontjdq,
     readinit;
    { TClientClass }constructor TClientClass.Create;
    begin
       inherited;
      IdUDPS := TIdUDPServer.Create(nil);
      sIdUDPS := TIdUDPClient.Create(nil);
      IDUDPS.DefaultPort:=fport;
      IDUDPS.ThreadedEvent:=True;
      IDUDPS.BufferSize:=8192;
      IdUDPS.OnUDPRead := IDUDPRead;  
      //IdUDPS.Active := True;
    end;destructor TClientClass.Destroy;
    begin
      FClient.Free;
      inherited;
    end;procedure TClientClass.Openontjdq;
    var
      ssh:array[0..5] of Byte;
    begin
      ssh[0]:=$05;
      ssh[1]:=$00;
      ssh[2]:=$3C;
      ssh[3]:=$01;
      ssh[4]:=$FD;
      ssh[5]:=$63;
      sIDUDPS.SendBuffer(fipaddress,fport,ssh,Length(ssh));
    end;procedure TClientClass.StartReadCard;  // 开始读卡
    var
      ssh:array[0..4] of Byte;begin
      ssh[0]:=$04;
      ssh[1]:=$00;
      ssh[2]:=$01;
      ssh[3]:=$DB;
      ssh[4]:=$4B;  sIDUDPS.SendBuffer(fipaddress,fport,ssh,Length(ssh));end;procedure TClientClass.openudp;
    begin
      IDUDPS.Active:=True;
    end;procedure TClientClass.closeudp;
    begin
      IDUDPS.Active:=False;
    end;procedure TClientClass.IDUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var
      fRecvUDPstring:string;
      DataStringStream:tstringstream;
      cDataParam: TCopyDataStruct;
      msg: AnsiString;
    begin
         DataStringStream:=tstringstream.Create('');
     TRY
       DataStringStream.CopyFrom(adata,adata.Size);
       fRecvUDPstring:=DataStringStream.DataString;
      // RemostIP:= ABinding.PeerIP;
     finally
       DataStringStream.Free;
     end;
       msg:=StrToHex(fRecvUDPstring);
       if fhand<>0 then
       begin
         cDataParam.dwData := WM_YOURMSG;
         cDataParam.cbData := length(msg)* sizeof(char)+1;
         cDataParam.lpData := @msg[1];
         SendMessage(fhand, WM_COPYDATA,0, LPARAM(@cDataParam));
       end;
    end;
    beginend.
    这是代码帮忙看看?谢谢
      

  2.   

    readinit里用到了string,
    不知道你调用的程序是用什么写的,如果不是delphi估计就不要用string了
    如果是delphi,那最好引用sharemm之类的东西,并用相同的delphi编译dll和exe吧或许是别的问题也不一定