2012-01-13 6 views
4

私はこのような関数へのポインタを持っています。functionpointerからfunctionnameを取得しますか?

TTestEvent = function(): Boolean; 

procedure ExecuteTest(aTest: TTestEvent; aType: String); 
begin 
    if aTest then 
    NotifyLog(aType + ' success') 
    else 
    TestError(aType + ' failed'); 
end; 

// Call the test 
procedure TestAll; 
begin 
    ExecuteTest(LoadParcels, 'LoadParcel'); 
end; 

しかし、functionpointer aTestから関数の名前を抽出する方が良いでしょう。

ので、代わりの

aType + ' success' 

私が欲しい

ExtractName(aTest) + ' success' 

のようなものは、これは、デルファイ、2007年に行われることができますか?

+0

属性を使用するのに適しています。 – Pol

+0

@Pol:高度なRtti機能を実装している最新のDelphiバージョンでのみ有効です。 – menjaraz

+0

私は単純なものがほしいだけです。だから私はJCLDebugまたはMadExceptを使用しない限り不可能です。 –

答えて

4

組み込み機能ではこれを行うことはできません。アドレスから関数名を取得するには、実行可能ファイルのマップを知る必要があります。これは、追加手順を実行しない限り、実行可能ファイルの一部ではありません。

JclDebugやmadExceptのようなデバッグツールは、探している機能を提供します。

0

あなたは

  • ValueとしてKey
  • 関数名として関数ポインタをDictionaryに基づいて登録メカニズムを実装することができます。

ExtractNameが辞書の方法となる。

スレッドセーフであることを忘れないでください。

6

オープンソースクラスを使用すると、シンボルの名前を見つけることができます。

実行可能ファイルをビルドするときは、プロジェクトオプションで「詳細マップ」を設定して、.mapファイルを作成する必要があります。

その後、.exe.mapを提供することができ、または.exeに追加することができ、当社の独自の.mabフォーマットに.mapを圧縮します。 .mab形式は、.zipまたは他のものよりも効率的です。これは、元の.mapファイルの約10倍です(JCLDebugまたはMaxExpectよりもはるかに小さく、標準の "Remoteデバッグシンボル "プロジェクトの埋め込みオプション)。

次にあなたが.mapファイルからデバッグ情報を取得するためにTSynMapFileクラスを使用、または.exeに埋め込まれた情報ことができます。これは、メソッドのような関数名、だけでなく、任意の他のシンボル、のために動作します

function ExtractName(aSymbolAddress: pointer): string; 
var i: integer; 
begin 
    with TSynMapFile.Create do // no name supplied -> will read from .exe 
    try 
    i := FindSymbol(aSymbolAddress); 
    if i>=0 then 
     result := Symbols[i].Name else 
     result := ''; 
    finally 
    Free; 
    end; 
end; 

またはグローバル変数。

クラスについては、this blog articleを参照してください。また、私たちのmORMotフレームワークやロギング機能で使用されても、フレームワーク全体(SynCommons.pasSynLZ.pas単位)を使う必要はありません。埋め込む "SQLite3 \ Samples \ 11 - Exception logging"サブフォルダのMap2Mab.dprプログラムを参照してください。ファイルの内容を.exeにマップします。

+1

+1すてきな解決策! .map/.mabファイルが改ざんされている可能性があります。どのようにセキュリティ上の懸念を抱くことができますか?新しい質問を投稿する必要がありますか? – menjaraz

+0

@menjaraz .mabコンテンツを.exeに埋め込み/追加すると(ソリューションの中で提案しているように)、簡単に改ざんされず、展開が簡単になります(.exeは1つだけです)。また、スタックトレース(ソースコードの行番号を含む)による例外ログとして、アプリケーションにいくつかの素敵な機能を追加することができます。 –

+0

@ArnaudBouchez改ざんはなぜ難しいですか?私はマップがexeに追加されるたびに、ハッカーがそれを読むのは簡単だと信じているので、これを批判的に意味するわけではありません。個人的にはmadExceptを使用しますが、.madファイルは配布しません。 Outユーザは、リリースされたすべてのバージョンの.madファイルを持っているので、意味のあるスタックトレースを生成できるアドレスのバグレポートを電子メールで送信します。 –

関連する問題