VBScript determine which function is running

≡放荡痞女 提交于 2021-02-07 04:32:25

问题


Is it possible in VBScript to determine the name of the function currently executing?

In .NET, you could do:

MethodBase method = MethodBase.GetCurrentMethod();
Console.WriteLine(method.Name);

回答1:


In the past, I build a callstack viewer to see the performance of each function that is called. This needs one extra line of VBS code per function/sub and some overhead during runtime of course because of the extra code.

bottom - up:

Function DoSomething(a, b, c)
    dim registerFunctionObj : Set registerFunctionObj = [new RegisterFunction]("DoSomething")

    ' other code
End Function

Whenever the function is called, it creates a new instance of the RegisterFunction object. When the function exits, the registerFunctionObj variable goes out of scope automatically, calling the Class_Terminate sub of the instance.

[new RegisterFunction] is just a function that return a registerFunction instance:

Function [new RegisterFunction](funcName)
    Set [new RegisterFunction] = new cls_RegisterFunction
    [new RegisterFunction].FunctionName = funcName
    Set [new RegisterFunction].CallStackViewer = CallStackViewer
End function

Class cls_RegisterFunction

    Private functionName_, startTime_, callStackViewer_, endTime_
    Private Sub Class_Initialize
        startTime_ = now
        callStackViewer_.LogInitialize me
    End Sub

    Public Property Let FunctionName(fName)
        functionName_ = fName
    End Property

    Public Property Set CallStackViewer(byRef csv)
        Set callStackViewer_ = csv
    End Property

    Private Sub Class_Terminate
        endTime_ = now
        callStackViewer_.LogTerminate me
    End Sub

End Class

The CallStackViewer instance is a singleton instance of the a CallStackViewer class, but you can make it a part of your project, so you retrieve it through you global project class:

Private PRIV_callStackViewer
Public Function CallStackViewer()
    If not IsObject(PRIV_callStackViewer) Then
        Set PRIV_callStackViewer = new cls_CallStackViewer
    End If
    Set CallStackViewer = PRIV_callStackViewer
End Function

Class cls_CallStackViewer
    Public Sub Class_Initialize
        ' Here you can retrieve all function libraries (as text file) extract the 
        ' function name, the file they are in and the linenumber
        ' Put them in a dictionary or a custom object
    End Sub

    Public Sub LogInitialize(byref registerFunction)
        ' Here you can push the function on a stack (use a standard dotnet list>stack for it),
        ' log the starttime to a log object or handle custom breakpoints
    End Sub

    Public Sub LogTerminate(byref registerFunction)
        ' Here you can pop the function from a stack, log the endtime to a log
        ' object or handle custom breakpoints
    End Sub

End Class

Disclaimer: The code in here is pure demo code created on the fly. It lacks functionality and is only here to explain the concept. It could contain errors and is not complete.

The only thing you need is one line of code per function and your own imagination to expand it.




回答2:


No, but you can easily implement it

dim module_name

sub sub1
  module_name = "sub1"
  wscript.echo "i'm " & module_name
  'do something
end sub

function function1
  module_name = "function1"
  wscript.echo "i'm " & module_name
  function1 = "something"
end function

In case of recursion you could also remember the level you'r in so that you can get out if getting too deep.



来源:https://stackoverflow.com/questions/10236849/vbscript-determine-which-function-is-running

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!