procedure TAAThread.Execute;
var s:string;
begin
  s:='jkchjvb';
  PostMessage(handle,WM_My,integer(s),6);
end;用这个发送字任串,发现字符串不能太长,否则出错。所以直接发指针procedure TAAThread.Execute;
var s:string;
begin
  s:='jkchjvb';
  PostMessage(handle,WM_My,integer(@s),6);
end;那么现在我应该如何在接收方得到这个字符串呢?

解决方案 »

  1.   

    一个进程的多线程程序,采用发消息的方式传递字符串,请使用SendMessage
    如果是两个进程传递字符串,需要采用内存映射文件或者采用发送 WM_COPYDATA 消息的方式
      

  2.   

    求教var
      str: PString;
      s: string;
    begin
      str := Pointer(msg.LParam);
      self.mmoInfo.Lines.Add(str);//会出昏,我用的是delphi2010
      dispose(str); // 释放
    end;
      

  3.   


    procedure TAAThread.Execute;
    var s:string;
    begin
      s:='jkchjvb';
      PostMessage(handle,WM_My,integer(s),6);
    end;这句话有问题,你用PostMessage,有一种情况会出错,就是你PostMessage之后,Execute执行完,s销毁了,这时处理var
      str: PString;
      s: string;
    begin
      str := Pointer(msg.LParam);
      self.mmoInfo.Lines.Add(str);//会出昏,我用的是delphi2010
      dispose(str); // 释放
    end;就会报地址错误,因为s指向的地址被释放了,如果用SendMessage就不会有这个问题。因为SendMessage会挂起本线程,直到消息处理函数返回。
      

  4.   


    procedure TForm1.OnSys(var msg: TMessage);
      var pData : PChar;
    begin  
      pData := PChar(msg.lparam);
      lst1.Items.Add(pData);
    end;procedure TForm1.btn1Click(Sender: TObject);
      var pData : string;
    begin
      pData := '测试测试测试';
      PostMessage(Handle,WM_SYS,0,Integer(pData));
    end;试试,未测试的代码
      

  5.   

    SomeStr:= 'adfdsafd';
    SendMessage(TheHandle, WM_TheMessage, Integer(pchar(SomeStr)), 0);
    var
      P: Pointer;   // 自由度大
    begin
      integer(P):= msg.WParam;
      text:= Strpas(p);
      

  6.   

    谢谢 指教
    你这种方法好像不行的,因为Integer(pchar(SomeStr))只能传递很少的字符,现需要传递几万字,所以希望直接传字任串指针,再把指针转回字任串
      

  7.   

    我记得STRING的长度好像能达到2G吧,怎么会不够呢?希望你能明白,你传的不是STRING,而是地址!!!
      

  8.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, StdCtrls;const
      WM_My=WM_USER+1;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Edit2: TEdit;
        procedure WMMy(var Msg: TMessage); message WM_My;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WMMy(var Msg: TMessage);
    var
      P: Pointer;
    begin
      if msg.Msg=WM_My then begin
      integer(P):= msg.WParam;
      edit1.Text:= Strpas(p);
      end;
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      SendMessage(handle, WM_My, Integer(pchar(edit2.Text)), 0);
    end;end.你试着往edit2中放任意长度的字符串,然后点下按钮试试
      

  9.   

    用SendMessage處理eg:SendMessage(TreeView.Handle,TVM_SETBKCOLOR,0,RGB(255,0,0)); 设置TV背景颜色SendMessage(Button.Handle,WM_LBUTTONDOWN,0,0);  鼠标左键按下SendMessage(Button.Handle,WM_LBUTTONUP,0,0);   鼠标左键抬起SendMessage(Edit.Handle,WM_SETTEXT,255,Integer(PChar('abc'))); 传递文本SendMessage(Edit.Handle,WM_Char,Wparam('Q'),2);  传递字符SendMessage(Button.Handle,BM_SETSTYLE,BS_RADIOBUTTON,1);  改变Button风格SendMessage(ComboBox.Handle,CB_SETDROPPEDWIDTH,300,0);  改变CBDownWidthWM_CUT、WM_COPY和WM_PASTE  剪切,复制,粘帖 
      

  10.   

    这种情况,你需要在线程中动态开辟内存(虽然这样做不是很好,但是不会有错误)//线程中:
    procedure TAAThread.Execute;
    var 
      p: Pointer;
    begin
      GetMem(p, 7);
      ZeroMemory(p, 7);
      Move('jkchjvb', p^)
      PostMessage(handle,WM_My,integer(p),6);
    end;
    //接收部分
    var
      p: Pointer;
    begin
      p := Pointer(msg.LParam);
      self.mmoInfo.Lines.Add(String(p));
      FreeMem(p); // 释放
    end;