我使用TMimeMess来解码基于Synapse的SMTP服务器的传入电子邮件.
我发现,为了解码50MB MIME消息(带附件的简单文本),TMimeMess使用了600-800MB的内存.
在这里解码代码:
FMimeMsg.Header.DecodeHeaders(FMimeMsg.MessagePart.Lines);
FMimeMsg.MessagePart.DecomposeParts;
ExtractPartsFromMess(FMimeMsg.MessagePart);
...
procedure ExtractPartsFromMess(AMimePart: TMimePart);
var i: integer;
begin
if AMimePart.GetSubPartCount = 0 then
Begin
if (AMimePart.PrimaryCode = MP_TEXT) then
Begin
AMimePart.DecodePart;
FBody.Add(string(ReadStrFromStream(AMimePart.DecodedLines,AMimePart.DecodedLines.Size)));
end
else if (AMimePart.PrimaryCode = MP_BINARY) then
Begin
if AMimePart.FileName <> '' then
Begin
AMimePart.DecodePart;
AMimePart.DecodedLines.SaveToFile(FPathToIncomingFolder+AMimePart.FileName);
end;
end;
end
else
Begin
for i:=0 to AMimePart.GetSubPartCount-1 do
Begin
ExtractPartsFromMess(AMimePart.GetSubPart(i));
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
谢谢.
我需要在不重新启动应用程序的情况下替换我的 dll,但是在 FreeLibrary 之后它仍然在使用并且无法删除。
请帮忙。
//...
function MyFunc(): PChar; stdcall; external 'MyDll.dll';
implementation
//...
hDLL := LoadLibrary('MyLib.dll');
if hDLL = 0 then
Begin
LogError('Can''t load MyLib.dll!');
exit;
end;
try
MyFunc();
finally
FreeLibrary(hDLL);
end;
if not DeleteFile('MyLib.dll') then
LogError('Can''t delete MyLib.dll!');
Run Code Online (Sandbox Code Playgroud)