检测VB6中是否附加调试器

时间:2012-02-29 20:00:57

标签: debugging vb6

我正在对一个用Visual Basic 6编写的旧应用程序进行一些维护工作,由于各种原因,我们有一部分代码只需要运行,如果我们通过VB6 IDE(即附加了调试器)。

在VB.NET中,您可以使用System.Diagnostics.Debugger.IsAttached()属性来执行此操作,但我在Google上的VB6中找不到类似内容。

有没有简单的方法来计算这些信息?

6 个答案:

答案 0 :(得分:11)

以下是我们正在使用的没有任何副作用的内容

Public Property Get InIde() As Boolean
    Debug.Assert pvSetTrue(InIde)
End Property

Private Function pvSetTrue(bValue As Boolean) As Boolean
    bValue = True
    pvSetTrue = True
End Function

答案 1 :(得分:7)

这是我一直在使用的功能:

Private Function RunningInIde() As Boolean
    On Error GoTo ErrHandler
    Debug.Print 1 / 0
ErrHandler:
    RunningInIde = (Err.Number <> 0)
End Function            ' RunningInIde

答案 2 :(得分:2)

我写了这样的东西一段时间后找不到它,再次需要它。所以我再次写了它,我认为我做对了:

Public Function IsRunningInIde() As Boolean
    Static bFlag As Boolean
    bFlag = Not bFlag
    If bFlag Then Debug.Assert IsRunningInIde()
    IsRunningInIde = Not bFlag
    bFlag = False
End Function

没有错误。

不重置错误。

只需一个功能。

第1行:“bFlag”的“静态”声明导致bFlag的值粘在多次调用“IsRunningInIde”上。我们想要这个,因为我自己调用了这个函数,并且我不想使用用户不需要的输入参数来丢弃函数。

第3行:未在IDE中运行时不调用“Debug.Assert”。因此,只有在IDE中,“IsrunningInIde”才会被递归调用。

第2行:如果不在递归调用中,则bFlag开始为false,并设置为true。如果在递归调用中(仅在IDE中运行时发生),它将从true开始,并被设置回false。

第3行:只有通过检查bFlag是否为真,才能通过递归方式调用“IsRunningInIde”。

第4行:如果在递归调用中,总是返回True,这并不重要,但不会导致Assert失败。如果不在递归调用中,则返回“Not bFlag”,如果递归调用IsRunningInIde,则bFlag现在为“False”,如果未递归调用则bFlag为“True”。所以基本上,如果bFlag在IDE中运行,则返回“True”。

第5行:清除bFlag,使其在下次调用此函数时始终为“False”。

很难解释,在两种情况下,最好在脑海中逐步完成。

如果您想要更简单地理解代码,请不要使用它。

如果此代码存在问题,我道歉并告诉我,以便我可以解决此问题。

答案 3 :(得分:1)

这是我的功能,类似于Josh的功能,但更容易阅读(见内部评论)。

我用了很长时间才忘记借来的地方......

Public Function InDesign() As Boolean
' Returns TRUE if in VB6 IDE
Static CallCount    As Integer
Static Res          As Boolean

    CallCount = CallCount + 1
    Select Case CallCount
    Case 1  ' Called for the 1st time
        Debug.Assert InDesign()
    Case 2  ' Called for the 2nd time: that means Debug.Assert 
            ' has been executed, so we're in the IDE
        Res = True
    End Select
    ' When Debug.Assert has been called, the function returns True
    ' in order to prevent the code execution from breaking
    InDesign = Res

    ' Reset for further calls
    CallCount = 0

End Function

答案 4 :(得分:0)

Public Function InIDE() As Boolean
On Error GoTo ErrHandler

    Debug.Print 1 \ 0 'If compiled, this line will not be present, so we immediately get into the next line without any speed loss

    InIDE = False

Exit Function
ErrHandler:
InIDE = True 'We'll get here if we're in the IDE because the IDE will try to output "Debug.Print 1 \ 0" (which of course raises an error).
End Function

答案 5 :(得分:0)

If InIDE() Then
    '- Yes
End If

用法:

import numpy as np

a = np.array([[  1, 1],[  1, 1],[  1, 1],
   [  2, 2],
   [  3, 3], [  3, 3], [  3, 3], [  3, 3],
   [  4, 4], [  4, 4]])
n = np.unique(a[:,0])
print(np.array([   [i, np.mean(a[a[:,0]==i,1])] for i in n]))