我正在处理Delphi 7
中的应用程序,该应用程序将运行并显示由FastMM4.pas
创建的日志。
应用程序将安装在系统的任何位置。我修改了FastMM4.pas
以便它CreateProcess
(inshort执行我的应用程序)
来自previous Question和Sertac Akyuz's answer
leakTracker.exe
将把fastmm4的日志文件作为参数并打开文件并显示。修改后的fastMM4.pas
将用于任何其他应用程序。
Procedure OpenTheLeakReader
begin
CmdLine := 'C:\Program Files\leakTracker\leakTracker.exe "';
lstrcat(CmdLine,CTheArGuements );
ZeroMemory(@SInfo, SizeOf(SInfo));
SInfo.cb := SizeOf(SInfo);
CreateProcess(nil, CmdLine, nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo);
end;
这很好但我已经对path
进行了硬编码,因为要获取我的应用程序路径..
[FastMM4] -cannot use SysUtils.pas //*1
-cannot use Registry.pas //*2
-cannot use ParamStr(0) //*3
-cannot use unitWithSysRegis //*4
[someAplicationWhichWillUseFastMM4] -Uses FastMM4.pas
在FAstMM4.pas
finalization
我有这个
if ifLeakedMemory then OpenTheLeakReader;
因为我不能拥有
*1 - SysUtils.pas
- 在FastMM4.pass中,因为这将取消安装fastmmm4
*2 - Registry.pas
- 搜索leakTracker
安装路径,但会卸载fastmm4
*3 - paramstr(0)
- 它在应用程序结束时出错。
*4 - unitWithSysRegis
- 使用SysUtils,在Fastm4使用子句中也无法使用注册表。
所以我被困在如何获取leakTracker.exe
的路径并通过CreateProcess将日志文件的路径发送到`leakTracker.exe'。
答案 0 :(得分:2)
(首先解释一下(关于问题中的链接问题),这个问题不仅仅是关于无法在FastMM4.pas中使用单元(具有需要内存分配的初始化部分).OP认为他的代码必须在FastMM完成内存管理器之后运行。如果在此之后分配内存,FastMM会引发异常,因此禁止通过RTL分配内存。)
<小时/> 使用上一个问题中指出的api注册表函数或Blorgbeard对此问题的评论。与前面的代码一起使用,它将变成这样的:
var
hReg: HKEY;
Ret: Longint;
RegDataType, RegDataSize: DWORD;
CmdLine: array [0..560] of Char; // increase as needed
Len: Integer;
SInfo: TStartupInfo;
PInfo: TProcessInformation;
initialization
{$ifndef BCB}
// fastmm code
{$endif}
finalization
{$ifndef PatchBCBTerminate}
FinalizeMemoryManager; // fastmm code
Ret := windows.RegOpenKeyEx(HKEY_LOCAL_MACHINE,
'SOFTWARE\[YourProgram]', // registry key to your program's path
0, KEY_READ, hReg);
RegDataType := REG_SZ;
RegDataSize := 260;
Ret := windows.RegQueryValueEx(hReg,
'path', // registry value containing your program's path
nil, @RegDataType, @CmdLine, @RegDataSize);
RegCloseKey(hReg);
CmdLine[RegDataSize - 1] := ' ';
CmdLine[RegDataSize] := '"'; // open doublequote in case spaces in path
Len := windows.GetModuleFileName(0,
PChar(@CmdLine[RegDataSize + 1]), 260) + RegDataSize;
while CmdLine[Len] <> '.' do // assumes executable has an extension
Dec(Len);
CmdLine[Len] := #0;
lstrcat(CmdLine, '_MemoryManager_EventLog.txt"'#0); // closing doublequote
ZeroMemory(@SInfo, SizeOf(SInfo));
SInfo.cb := SizeOf(SInfo);
CreateProcess(nil, CmdLine, nil, nil, False,
NORMAL_PRIORITY_CLASS, nil, nil, sInfo, pInfo);
{$endif}
end.