delphi使用消息传递字符串有三种方式可以实现:
1、直接传递,但只能传递给同进程的窗口,无法实现跨进程的消息传递
传递消息:
var Str: String; begin Str := 'some string'; PostMessage(Handle, 0, 0, Integer(Str)); end;
接收消息:
var Str: String; begin Str := String(Msg.LParam); ShowMessage(Str); end;
2、如果线程之间传递可以使用PostThreadMessage传递,PostThreadMessage是该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
传递消息:
Procedure TThread1.Execute; var sMes:String; pMes:^String; iTemp:Integer; begin sMes:=’Test’; New(pMes); pMes^:=sMes; PostThreadMessage(thread2.ThreadID,WM_StartRecording,Integer(pMes),0); iTemp:=111; PostThreadMessage(thread2.ThreadID,WM_OriginalData,iTemp,0); end;
接收消息:
procedure TThread2.Execute; var msg:TMsg; sMes:String; pMes:^String; iTemp:Integer; begin //消息循环 while GetMessage(msg,0,0,0) do begin Case msg.message of WM_StartRecording: begin //传过来的是String; pMes:=msg.wParam; sMes:=pMes^; Dispose(pMes); WM_OriginalData: begin //传过来的是整数 iTemp:=msg.WParam; end; else begin TranslateMessage(msg); DispatchMessage(msg); end; end; end; end;
使用该方法同时还可以传递stringlist,方法是:
发送方: a:TStrings; a := TStringList.Create; SendMessage(Formb.Handle, WM_YOURMESSAGE, 0, LongInt(a)); 接收方: b:TStrings; b := TStringList.Create; b.Assign(TStrings(Msg.WParam)); TStrings(Msg.WParam).Free;
var pTel: ^string; begin sTelTmp := '10086'; New(pTel); pTel^ :=sTelTmp; SendMessage(Handle, WM_RCV_AUTO_REPORT, EV_TEL_MT_CALLOUT, Integer(pTel)); end;
接收消息:
procedure OnReciveDataMsg(var Msg: TMessage); message WM_RCV_AUTO_REPORT; var pTel: ^string; begin pTel := Pointer(Msg.LParam); sTelPhone := G_GetRealTelPhone(pTel^); Dispose(pTel); end;
3、使用WM_COPYDATA传递,进程间的数据传递好像只有用wm_copydata消息,它可以跨进程拷贝内存。
发送消息:
procedure SendString(strMSG: string); var Data: tagCOPYDATASTRUCT; pBuf: PChar; begin GetMem(pBuf, Length(strMSG) + 1); try ZeroMemory(pBuf, Length(strMSG) + 1); StrPCopy(pBuf, strMSG); Data.cbData:= Length(strMSG); Data.dwData:= Length(strMSG); Data.lpData:= pBuf; SendMessage(hTargetWin, WM_COPYDATA, Integer(Self.Handle), Integer(@Data)); finally FreeMem(pBuf); end; end;
接收消息:procedure WMCopyData(var MSG: TMessage); message WM_COPYDATA; procedure WMCopyData(var MSG: TMessage); var Data : ^tagCOPYDATASTRUCT; strMSG: string; begin Data:= Pointer(Msg.lParam); strMSG:= StrPas(Data.lpData); ShowMessage(strMSG); end;
可以根据实际情况使用相应的方式来实现消息传递字符串。