0

Delphi 7によって作成されたログを実行して表示するアプリケーションに取り組んでいますFastMM4.pas

アプリケーションはシステムのどこにでもインストールされます。私はFastMM4.pasそれがCreateProcess(要するに私のアプリケーションを実行する)ように変更しました私の 前の質問からのコードとSertacAkyuzの答え

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のuses句でもレジストリを使用できません。

leakTracker.exeそのため、CreateProcessを介してログファイルのパスを取得して`leakTracker.exe'に送信する方法に固執しています。

4

1 に答える 1

2

(最初の説明(質問のリンクされた質問に関して)については、この質問はFastMM4.pasでユニットを使用できない(メモリ割り当てを必要とする初期化セクションがある)だけではありません。OPは、コードをFastMMの後に実行する必要があると考えています。メモリマネージャをファイナライズします。その後メモリが割り当てられると、FastMMは例外を発生させるため、RTLを介したメモリの割り当ては禁止されています。)


前の質問で指摘したように、またはBlorgbeardがこの質問にコメントしたように、APIレジストリ関数を使用してください。前のコードを組み込むと、次のようになります。

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.
于 2012-06-09T12:57:33.057 に答える