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;那么现在我应该如何在接收方得到这个字符串呢?
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;那么现在我应该如何在接收方得到这个字符串呢?
如果是两个进程传递字符串,需要采用内存映射文件或者采用发送 WM_COPYDATA 消息的方式
str: PString;
s: string;
begin
str := Pointer(msg.LParam);
self.mmoInfo.Lines.Add(str);//会出昏,我用的是delphi2010
dispose(str); // 释放
end;
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会挂起本线程,直到消息处理函数返回。
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;试试,未测试的代码
SendMessage(TheHandle, WM_TheMessage, Integer(pchar(SomeStr)), 0);
var
P: Pointer; // 自由度大
begin
integer(P):= msg.WParam;
text:= Strpas(p);
你这种方法好像不行的,因为Integer(pchar(SomeStr))只能传递很少的字符,现需要传递几万字,所以希望直接传字任串指针,再把指针转回字任串
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中放任意长度的字符串,然后点下按钮试试
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;