【发布时间】:2012-05-28 12:33:20
【问题描述】:
我正在开发一个使用来自sourceforge.net 的FastMM4 的应用程序。
所以我在开头就将FastMM4.pas 添加到了uses 子句中。在应用程序中,我需要像这样在finalization 的finalization 中的FinalizeMemoryManager; 之后运行batch 文件
initialization
RunInitializationCode;
finalization
{$ifndef PatchBCBTerminate}
FinalizeMemoryManager;
RunTheBatFileAtTheEnd; //my code here..calling a procedure
{$endif}
end.
那么我的 RunTheBatFileAtTheEnd 代码是:
procedure RunTheBatFileAtTheEnd;
begin
//some code here....
sFilePaTh:=SysUtils.ExtractFilePath(applicaTname)+sFileNameNoextension+'_log.nam';
ShellExecute(applcatiOnHAndle,'open', pchar(sExeName),pchar(sFilePaTh), nil, SW_SHOWNORMAL) ;
end;
为此,我需要在 fastmm4 单元的 uses 子句中使用 SysUtils,shellapi。 但使用它们
这条消息来了
但如果我从用途中删除SysUtils,shellapi,它就可以工作。
我仍然需要安装 fastmm4 的所有功能,但是 SysUtils,shellapi 没有安装 fastmm4
我有一个自己的单元,但它的最终化是在 fastmm4 最终化之前执行的。
谁能告诉我如何解决这个问题?
编辑- 1
unit FastMM4;
//...
...
implementation
uses
{$ifndef Linux}Windows,{$ifdef FullDebugMode}{$ifdef Delphi4or5}ShlObj,{$else}
SHFolder,{$endif}{$endif}{$else}Libc,{$endif}FastMM4Messages,SysUtils,shellapi;
我的申请
program memCheckTest;
uses
FastMM4,
EDIT-2:
(在@SertacAkyuz 回答之后),我删除了SysUtils 并且它有效,但我仍然需要运行批处理文件以通过RunTheBatFileAtTheEnd 打开外部应用程序。原因是..我希望外部应用程序仅在 FastMM4 退出 finalization 之后运行。 sExeName 是运行文件 sFilePaTh(.nam) 的应用程序。任何人都可以告诉如何做到这一点?没有uninstalling FastMM4。
【问题讨论】:
-
哪个使用子句?如果在界面中,您使 FastMM4 依赖于它们,它们将首先被初始化,包括它们所依赖的任何单元。在那里完成的任何内存分配都会导致这种情况。您是否尝试过将这两个单元移至实施条款?这应该会改变依赖顺序。
-
@MarjanVenema :我为使用条款添加了新代码,
SysUtils,shellapi;在implementation中 -
你必须不用'sysutils'。 'sysutils' 的初始化部分的代码需要分配内存,因此必须设置内存管理器。
-
@SertacAkyuz 好的,所以
sysutils是问题所在,我会尝试一下