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

时间:2010-04-13 18:27:08

标签: vb6

我目前正在维护一些代码,很快就会被重构。在此之前,我想制作标准的错误处理代码,该代码由外接程序注入,效率更高,占用的空间更少。令我烦恼的一件事是每个模块都有一个名为m_ksModuleName的常量,用于构造一个大字符串,然后从错误处理程序中重新抛出,这样我们就可以跟踪错误堆栈。这是所有模板代码,即重复,但我可以轻松地将其删除到过程调用。现在,我修复了代码,以便您可以将Me引用传递给过程 - 但是您不能为BAS模块执行此操作。您也无法访问项目名称(例如,作为ProgramID的一部分传递的部分) - 尽管您自己提出错误时会得到它。

所有这些字符串都包含在EXE,DLL或OCX中 - 相信我,我使用调试器来查找它们。但是如何在代码中访问这些?

2 个答案:

答案 0 :(得分:1)

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

'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之外。

答案 1 :(得分:1)

AFAIK无法在代码中获取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,因此我们可以判断错误何时跨越组件边界。