代码之家  ›  专栏  ›  技术社区  ›  Mark Bertenshaw

如何从代码访问vb6模块的名称?

vb6
  •  1
  • Mark Bertenshaw  · 技术社区  · 14 年前

    我目前正在维护一些代码,这些代码很可能很快就会被重构。在这之前,我想让标准的错误处理代码(由外接程序注入)更高效,占用更少的空间。令我恼火的是每个模块都有一个常量 m_ksModuleName 它用来构造一个大字符串,然后从错误处理程序中重新抛出,以便我们可以跟踪错误堆栈。这是所有的模板代码,即重复的,但我可以很容易地将其分解为一个过程调用。现在,我已经修复了代码,这样您就可以将me引用传递给过程了——但是对于bas模块,您不能这样做。您也不能访问项目名称(例如,将作为programid的一部分传递的部分),尽管您在自己引发错误时会得到它。

    所有这些字符串都包含在exe、dll或ocx中-相信我,我已经用调试器找到了它们。但是我怎样才能用代码访问它们呢?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Community Jaime Torres    7 年前

    恐怕无法在代码中获得BAS模块的名称。通常的解决方案是使用模块级常量,如 Mike's answer .

    afaik获取progid(编程id, 项目名称 在“项目属性”对话框中)将引发BAS模块中的错误,将其捕获,然后读取 Err.Source .

    这一切都很麻烦,这就是为什么我们通常不麻烦在标准错误处理程序中包含模块名或progid。我们使用例程的名称“滚动自己的”调用堆栈。这总是足够的信息,以找出哪些模块涉及。BAS模块中的例程通常有唯一的名称,对吧?

    有点像 this ,您可以使用 MZTools VB6加入。

    Sub / Function whatever 
    On Error Goto Handler
    do some stuff
    Exit Sub / Function
    
    Handler:
    Err.Raise Err.Number, "(function_name)->" & Err.source, Err.Description 
    End Sub
    

    dll或ocx中的每个顶级例程都有类似的错误处理程序,但也包括 App.ExeName 所以我们可以判断错误何时跨越组件边界。

        2
  •  1
  •   Mike Spross Alex Martelli    14 年前

    我不确定是否有一种简单的方法以编程方式获取您所在模块的名称。通常的解决方案是将每个方法顶部的变量设置为模块的名称,然后错误处理程序可以使用该变量进行日志记录:

    'In MyModule.bas'
    
    Public Sub Foo()
    
       Const MODULE_NAME As String = "MyModule"
    
       On Error GoTo ErrorHandler
    
       ' Code here '
    
       Exit Sub
    
    ErrorHandler:
    
       LogError Err.Number, Err.Description, MODULE_NAME
    
    End Sub   
    

    如果您使用的是mztools这样的插件,那么它会为您生成这个样板代码。

    对于获取当前组件名称,可以使用 App.EXEName (尽管有这个名称,但这适用于其他项目类型,如dll)。此值从 项目名称 在IDE中运行时项目属性(项目->属性)中的字段,以及在IDE外部运行时编译的二进制文件名(减去文件扩展名)中的字段。