delphi使用消息传递字符串有三种方式可以实现
2015-04-14 17:50
1071 查看
1、直接传递,但只能传递给同进程的窗口,无法实现跨进程的消息传递
传递消息:
[delphi] view plaincopy
var
Str: String;
begin
Str := 'some string';
PostMessage(Handle, 0, 0, Integer(Str));
end;
接收消息:
[delphi] view plaincopy
var
Str: String;
begin
Str := String(Msg.LParam);
ShowMessage(Str);
end;
2、如果线程之间传递可以使用PostThreadMessage传递,PostThreadMessage是该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
传递消息:
[delphi] view plaincopy
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;
接收消息:
[delphi] view plaincopy
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,方法是:
[delphi] view plaincopy
发送方:
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;
如果同一进程传递字符串可以使用PostMessage传递,该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。
发送消息:
[delphi] view plaincopy
<pre class="delphi" name="code">var
pTel: ^string;
begin
sTelTmp := '10086';
New(pTel);
pTel^ :=sTelTmp;
SendMessage(Handle, WM_RCV_AUTO_REPORT, EV_TEL_MT_CALLOUT, Integer(pTel));
end;</pre><br>
<pre></pre>
<br>
接收消息:
[delphi] view plaincopy
<pre class="delphi" name="code">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;
</pre>
<pre></pre>
<p> </p>
<p><strong>3、使用WM_COPYDATA传递,进程间的数据传递好像只有用wm_copydata消息,它可以跨进程拷贝内存。</strong></p>
<p>发送消息:</p>
<pre class="delphi" name="code">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;</pre>
<p><br>
接收消息:</p>
<pre class="delphi" name="code">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;</pre>
<p><br>
可以根据实际情况使用相应的方式来实现消息传递字符串。<br>
</p>
传递消息:
[delphi] view plaincopy
var
Str: String;
begin
Str := 'some string';
PostMessage(Handle, 0, 0, Integer(Str));
end;
接收消息:
[delphi] view plaincopy
var
Str: String;
begin
Str := String(Msg.LParam);
ShowMessage(Str);
end;
2、如果线程之间传递可以使用PostThreadMessage传递,PostThreadMessage是该函数将一个消息放入(寄送)到指定线程的消息队列里,不等待线程处理消息就返回。
传递消息:
[delphi] view plaincopy
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;
接收消息:
[delphi] view plaincopy
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,方法是:
[delphi] view plaincopy
发送方:
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;
如果同一进程传递字符串可以使用PostMessage传递,该函数将一个消息放入(寄送)到与指定窗口创建的线程相联系消息队列里,不等待线程处理消息就返回,是异步消息模式。消息队列里的消息通过调用GetMessage和PeekMessage取得。
发送消息:
[delphi] view plaincopy
<pre class="delphi" name="code">var
pTel: ^string;
begin
sTelTmp := '10086';
New(pTel);
pTel^ :=sTelTmp;
SendMessage(Handle, WM_RCV_AUTO_REPORT, EV_TEL_MT_CALLOUT, Integer(pTel));
end;</pre><br>
<pre></pre>
<br>
接收消息:
[delphi] view plaincopy
<pre class="delphi" name="code">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;
</pre>
<pre></pre>
<p> </p>
<p><strong>3、使用WM_COPYDATA传递,进程间的数据传递好像只有用wm_copydata消息,它可以跨进程拷贝内存。</strong></p>
<p>发送消息:</p>
<pre class="delphi" name="code">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;</pre>
<p><br>
接收消息:</p>
<pre class="delphi" name="code">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;</pre>
<p><br>
可以根据实际情况使用相应的方式来实现消息传递字符串。<br>
</p>
相关文章推荐
- delphi的消息机制实现消息传递字符串
- Delphi字符串 消息机制实现消息传递字符串
- Delphi字符串 DLL传递字符串方式
- 图片转成BASE64字符串,然后以JSON的方式传递。当图片大小在1M左右的时候没问题,可以上传。但是当文件大小>1.5M的是否发现图片转BASE64不成功,居然得到的值是NULL
- 详解python使用递归、尾递归、循环三种方式实现斐波那契数列
- @Param注解在Mybatis中的使用 以及传递参数的三种方式
- Atitit 三种并发编程模型 艾龙 attilax总结 1. 并发系统可以使用不同的并发模型去实现。 1 2. 并行工作者 并行工作者模型。进来的任务分配给不同的工作者 银行模式 2 2.1.
- servlet(三)-如何使用传参-三种转发方式、传递参数以及对象中数据的范围
- String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串(内含许多实验测试)
- Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。
- WM_ERASEBKGND官方解释(翻译),以及Delphi里所有的使用情况(就是绘制窗口控件背景色,并阻止进一步传递消息)
- @Param 注解在Mybatis中的使用 以及传递参数的三种方式
- 使用Eclipse RCP创建视图并实现视图间消息传递
- Delphi中window消息截获的实现方式(1)
- Delphi中window消息截获的实现方式(2)
- 请实现一个算法,在不使用额外数据结构和储存空间的情况下,翻转一个给定的字符串(可以使用单个过程变量)。 给定一个string iniString,请返回一个string,为翻转后的字符串。保证字符串的
- Tomcat实现session保持的三种方式、使用msm方式搭建jsp网站
- 使用Lock,wait/notify,Semaphore三种方式实现多线程通信
- Linux 下C使用XML传递消息(字符串)
- java三种方式实现字符串反转(StringBuilder类,数组和栈)