代码如下:
procedure TPerformSocket.PerformGetAllPos(DeptID: string; SocketID: string);      //取得所有的吧台
var
  wl: string;
  SocketTo: TCustomWinSocket;
  PSendInfo: pwidechar;
begin
  SocketTo := TCustomWinSocket.Create(StrToInt(SocketID));
  wl := 'select PosName from T_Pos where DeptID = ' + '''' + DeptID + '''';
  if DM.SearchSQL(wl, DM.AQ) then
  begin
    wl := '';
    while not DM.AQ.Eof do
    begin
      wl := wl + DM.AQ.FieldByName('PosName').AsString + ',';
      DM.AQ.Next;
    end;
    GetMem(PSendInfo, Length(wl));
    PSendInfo := pwidechar(wl);  //这个地方转换完以后PsendInfo就变成乱码了
    SocketTo.SendBuf(PSendInfo^, Length(PSendInfo));
  end
  else
  begin
    SocketTo.SendText('');
  end;
//谢谢了

解决方案 »

  1.   

    procedure TPerformSocket.PerformGetAllPos(DeptID: string; SocketID: string);      //取得所有的吧台
    var
      wl: string;
      SocketTo: TCustomWinSocket;
      PSendInfo: pwidechar;
    begin
      SocketTo := TCustomWinSocket.Create(StrToInt(SocketID));
      wl := 'select PosName from T_Pos where DeptID = ' + '''' + DeptID + '''';
      if DM.SearchSQL(wl, DM.AQ) then
      begin
        wl := '';
        while not DM.AQ.Eof do
        begin
          wl := wl + DM.AQ.FieldByName('PosName').AsString + ',';
          DM.AQ.Next;
        end;//    GetMem(PSendInfo, Length(wl));    
    //    PSendInfo := pwidechar(wl);  //这个地方转换完以后PsendInfo就变成乱码了
    //不要用pwidechar    if wl <> '' then
          SocketTo.SendBuf(wl[1], Length(w1));
      end
      else
      begin
        SocketTo.SendText('');
      end;
      

  2.   

    如果你要转换成widestring,那么
    procedure TPerformSocket.PerformGetAllPos(DeptID: string; SocketID: string);      //取得所有的吧台
    var
      wl: string;
      w2: widestring;
      SocketTo: TCustomWinSocket;
    begin
      SocketTo := TCustomWinSocket.Create(StrToInt(SocketID));
      wl := 'select PosName from T_Pos where DeptID = ' + '''' + DeptID + '''';
      if DM.SearchSQL(wl, DM.AQ) then
      begin
        wl := '';
        while not DM.AQ.Eof do
        begin
          wl := wl + DM.AQ.FieldByName('PosName').AsString + ',';
          DM.AQ.Next;
        end;    if wl <> '' then
        begin
          w2 := w1;
          SocketTo.SendBuf(w2[1], Length(w1) * 2);
        end;
      end
      else
      begin
        SocketTo.SendText('');
      end;
      

  3.   

    SocketTo.SendBuf(w2[1], Length(w1) * 2);
    w2[1]是什么意思??
      

  4.   

    其实w2[1]没有什么意思,这是只是一个语法现象,procedure sendbuf(const x, ...);在这种声明中,传递w2[1],Delphi不会对w2[1]进行求值,
    它只会将w2的值传递给sendbuf,而不是w2的地址