Delphi 邮件大小的限制?

Delphi 邮件大小的限制?,delphi,multithreading,Delphi,Multithreading,我正在使用以下命令向主窗体发送日志消息: 要发送此消息,请执行以下操作: procedure LogMsg(Msg: string; Kind:TMsgType=msgNormal); var p: pChar; begin case Kind of msgError: Msg := '[Error] ' + Msg; msgInformation: Msg := '# ' + Msg; msgExternal: Msg := 'Plugin: ' + M

我正在使用以下命令向主窗体发送日志消息:

要发送此消息,请执行以下操作:

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对数据的大小有限制,或者可能是其他内容

这是德尔福2010


编辑:对不起,我忘了显示msg的类型。是字符串。

我想你不应该使用Move。您确定所有字符的长度都相同吗

更新:

GetMem(p, (Length(Msg) + 1)*SizeOf(Char)); 
Move(Msg[1], p^, (Length(Msg)+ 1)*SizeOf(Char)); 

我从来没有使用过太多的pChar,但是在执行此操作之前,您不需要在Msg字符串中附加一个0字符吗。Delphi 2010在使用GetMem时不会将内存归零。

我选择的是另一条路线,而不是mghie,他的答案在我身上神奇地完全消失了:p,看看你的代码,我只能推断你是在同一个过程中发送数据的

您只是在PostMessage中传递一个指针,因此消息大小没有限制。当你调试你的代码时,你正在调试那段代码,对吗?它在哪一行中断?文本的赋值

首先尝试将pchar分配给字符串,然后将该字符串写入文件。如果这样做有效,你就有了一个方向


如果不起作用,请使用调试器验证指针是否确实指向字符串,以及该字符串是否以零结尾。从您发布的代码来看,似乎是这样。

PostMessage只能发送整数,因此肯定不是这样。不,您应该将其作为答案发布,因为它是正确的答案。这不能解决Mamcx的问题,但他没有要求解决;他只是问消息长度是否是原因。有一条信息缺失——您正在移动其数据的Msg变量的类型是什么?该变量的声明可能与消息接收器代码的行为不符合预期的原因有关。还有,什么东西太大了?Msg数据的长度是多少?这是否一致,即长度为N-1的消息是否始终有效,长度为N的消息是否始终挂起在尚未指定N的位置?最后[sic]消息处理程序中对FreeMemp的调用应该在异常处理程序中重复,或者最好是在尝试中。最后,确保释放p。虽然有更好的方法来复制字符串,但使用Move的代码没有问题。字符的长度显然是相同的,因为它们都在同一个程序中,而且他复制的字符数量与他分配的内存数量完全相同。更好的方法是:var p:PString;Newp;p^:=味精;然后,在消息处理程序中:var p:PString;p:=PStringMsg.LParam;EditLog.Addp^;处置;所以,这就是答案,不是对它的限制。而且你的代码更干净!。请写一个答案,这样我就可以做标记了。python的问题与@Paul Jan有关:在这个消失的行为中没有魔法——在重新阅读这个问题时,我得出结论,这个PostMessage确实只能在同一个应用程序中,所以我删除了答案。是的,在同一个应用程序中。我需要这样做,因为代码位于多线程服务器上,使用将日志输出发送到主线程的RemObjects。