2012-01-13 81 views
4

我有一个像这样的函数的指针。从函数指针获取函数名?

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; 

但是,从函数指针aTest中提取函数的名称会更好。

所以不是

aType + ' success' 

我想是这样

ExtractName(aTest) + ' success' 

可这在德尔福2007年做什么?

+0

看起来像一个使用属性的好地方。 – Pol 2012-01-13 07:56:26

+0

@Pol:仅适用于实现高级Rtti功能的最新Delphi版本。 – menjaraz 2012-01-13 08:01:49

+0

我只是想要一些简单的东西。所以答案这是不可能的,除非我使用JCLDebug或MadExcept适合我。 – 2012-01-13 09:01:24

回答

4

您无法使用内置功能执行此操作。为了从地址获得函数名称,您需要知道可执行文件的映射。这不是可执行文件的一部分,除非您采取措施添加它。

调试工具(如JclDebug和madExcept)提供了您正在查找的功能。

0

您可以实现基于一个Dictionary注册机制与

  • 函数指针作为Key
  • 功能名称作为Value

ExtractName将是字典的一种方法。

如果需要的话,不要忘记让它线程安全。

6

如果您使用我们的一些开源课程,您将能够找到任何符号的名称。

在构建可执行文件时,必须通过在项目中设置“Detailed map”选项来创建.map文件。

然后,您可以用.exe交付.map,或压缩.map到我们的专有.mab格式,它可以被附加到.exe.mab格式比.zip或其他用于此任务的效率高很多:它比原始文件.map小约10倍(即,比JCLDebug或MaxExpect产品小得多,而且比使用标准“Remote调试符号“嵌入项目选项)。

然后你可以使用TSynMapFile类检索来自.map文件调试信息,或者嵌入到.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 - 异常日志记录”子文件夹中的Map2Mab.dpr程序。将文件内容映射到.exe中。

+1

+1尼斯解决方案! .map/.mab文件可能被篡改。安全问题如何得到解决?我应该发布一个新问题吗? – menjaraz 2012-01-13 09:20:15

+0

@menjaraz如果您将.mab内容嵌入/追加到.exe中(正如我在解决方案中所建议的那样),它不会轻易被篡改,并且会简化部署(只有一个.exe)。您可以为应用程序添加一些很好的功能,例如使用堆栈跟踪(包括源代码行号)进行异常记录。 – 2012-01-13 09:48:42

+0

@ArnaudBouchez为什么篡改会很难?我的意思并不是这个意思,因为我相信,只要地图附加到exe文件中,黑客就很容易阅读它。我们亲自使用madExcept,但不要分发.mad文件。因为我们确实有所有发布版本的.mad文件,所以用户可以通过地址发送电子邮件错误报告,然后生成有意义的堆栈跟踪。 – 2012-01-13 10:38:01