我正在使用以下命令向主表单发送日志消息:
用于发送消息:
procedure LogMsg(Msg: string; Kind:TMsgType=msgNormal);
var
p: pChar;
begin
case Kind of
msgError: Msg := '[Error] ' + Msg;
msgInformation: Msg := '# ' + Msg;
msgExternal: Msg := 'Plugin: ' + Msg;
end;//if
GetMem(p, (Length(Msg) + 1)*SizeOf(Char));
Move(Msg[1], p^, (Length(Msg)+ 1)*SizeOf(Char));
PostMessage(Application.MainForm.Handle, WM_LOG_MESSAGE, 0, integer(p));
end;
并显示它:
procedure TfrmMain.WMLog(var Message: TMessage);
var
p: pChar;
Lista:TStringList;
begin
try
p := pChar(Message.LParam);
if EditLog.Lines.Count>100 then
begin
EditLog.Lines.Clear;
end;//if
Lista := TStringList.Create;
try
Lista.Delimiter := #10;
Lista.text := p;
EditLog.Lines.AddStrings(Lista);
finally
Lista.Free;
end;//try
{$ifndef FPC}
EditLog.GotoLineAndCenter( EditLog.Lines.Count );
{$endif}
Freemem(p);
except
on E: Exception do
EditLog.Lines.Add(E.Classname + ': ' + E.Message);
end;//try
end;
这是用于记录执行某些python脚本的输出。
但是看起来如果消息字符串太大,则进程挂起并且必须终止python进程。
我不知道可能存在限制。 PostMessage对数据的大小有限制,或者可能是其他什么?
这是Delphi 2010。
编辑:对不起,我忘了显示msg的类型。是String
。
答案 0 :(得分:0)
我认为你不应该使用Move
。你确定所有的角色都是相同的长度吗?
更新:
GetMem(p, (Length(Msg) + 1)*SizeOf(Char));
Move(Msg[1], p^, (Length(Msg)+ 1)*SizeOf(Char));
我从来没有过多地使用过pChar,但是在执行此操作之前,您不必在Msg
字符串中添加#0字符。使用GetMem
时,Delphi 2010不会将内存清零。
答案 1 :(得分:0)
我在这里采取的另一条路线不是mghie(他们完全回答魔法完全非魔法地消失在我身上:P),看着你的代码我只能推断你发送数据在同一个过程中。
您只是通过PostMessage传递指针,因此对邮件大小没有限制。当您调试代码时( 调试那段代码,对吧?),它在什么行上破坏了? .text的分配?
首先尝试将pchar分配给字符串,然后将该字符串写入文件。如果有效,你有一个方向可以调查。
如果这不起作用,请使用调试器验证指针确实指向字符串,并且该字符串是否为零终止。从您发布的代码中看起来就像是。