德尔福 7,使用 FastMM4 获取应用路径并打开应用



我正在开发一个Delphi 7的应用程序,该应用程序将运行并显示FastMM4.pas创建的日志。

该应用程序将安装在系统上的任何位置。我已经修改了FastMM4.pas,以便它会CreateProcess(简而言之执行我的应用程序)我之前的问题和Sertac Akyuz的答案中的代码

leakTracker.exe将采用 fastmm4 的日志文件作为参数,并打开文件并显示。修改后的fastMM4.pas将用于任何其他应用程序。

Procedure OpenTheLeakReader
 begin
 CmdLine := 'C:Program FilesleakTrackerleakTracker.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 将日志文件的路径发送到"泄漏跟踪器.exe"上。

(首先要解释一下(关于问题中链接的问题),这个问题不仅仅是关于不能在 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.

相关内容

  • 没有找到相关文章

最新更新