2012-02-29 14 views
5

Estoy haciendo un trabajo de mantenimiento en una de nuestras aplicaciones anteriores que está escrito en Visual Basic 6, y por diversas razones, tenemos una parte del código que solo debe ejecutarse si estamos ejecutando el programa a través del VB6 IDE (es decir, el depurador está adjunto).Detectar si el depurador está conectado en VB6

En VB.NET, puede hacerlo utilizando la propiedad System.Diagnostics.Debugger.IsAttached(), pero no puedo encontrar nada similar en VB6 en Google.

¿Hay alguna manera fácil de encontrar esta información?

+0

Véase también la pregunta [modo de depuración en Visual Basic 6] (http://stackoverflow.com/questions/ 9052024/debug-mode-in-vb-6) – MarkJ

+0

Ejecutar en el IDE no es lo mismo que tener un depurador conectado, lo que también se puede hacer, por supuesto, pero es algo diferente. – Bob77

Respuesta

7

Aquí es una función que he estado usando:

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

¡Eso se ve genial! Una pregunta, sin embargo. Si tenemos otras instrucciones 'On Error GoTo' fuera de esta función, ¿tendré que restablecerlas fuera de esta función? ¿O el controlador de errores tiene un alcance dentro de la función? – bhamby

+0

@galador Todos los errores arrojados en esta función se manejarán dentro de esta función y no será necesario reiniciar. –

+2

Esta función restablece el objeto 'Err' como un efecto secundario – wqw

9

Esto es lo que estamos utilizando, que no tiene efectos secundarios

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 
+2

Sin ningún efecto secundario, el póster significa que si tiene activada la opción "Romper todos los errores", esto no detendrá la ejecución del programa, como lo hace la respuesta aceptada de @Jay Riggs (lo cual puede ser muy molesto si utiliza InIde en todas partes el lugar. –

+0

@Kris: Eso, y no restablecer el objeto 'Err' si se usa' On Error Resume Next' + 'Err.Number <> 0' estilo de comprobación de errores. Por cierto, nunca se ha visto a nadie usando nada más que' Break On Unhandled Errores' (a menos que no tenga ni idea de estas configuraciones IDE). – wqw

+0

@Kris: Dos años después de su comentario original, estoy convencido de que "Romper todos los errores" es la manera de seguir cualquier proyecto remotamente profesional. Me costó una mano y una pierna para refactorizar todos mis "códigos" pero valió la pena. ¡Gracias por abrir los ojos! – wqw

2

me escribió algo como esto un tiempo atrás y puede' lo encuentro, y lo necesitaba de nuevo. Así que simplemente lo escribí de nuevo y creo que lo entendí bien:

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 

No hay errores que se plantean.

Sin reinicio de Err.

Solo una función.

Línea 1: La declaración "Estática" de "bFlag" hace que el valor de bFlag se adhiera a varias llamadas a "IsRunningInIde". Queremos esto porque llamo a esta función dentro de sí misma, y ​​no quería desperdiciar la función con parámetros de entrada que el usuario no necesita.

Línea 3: El "Debug.Assert" no se llama cuando no se ejecuta en el IDE. Entonces, solo cuando en el IDE se llama a "IsrunningInIde" de forma recursiva.

Línea 2: Si no está en la llamada recursiva, bFlag comienza como falso y se establece en verdadero. Si está en la llamada recursiva (solo ocurre cuando se ejecuta en el IDE), comienza como verdadero y vuelve a establecerse en falso.

Línea 3: Solo llame a "IsRunningInIde" si aún no está en esta función recursivamente, marcando si bFlag es verdadero.

Línea 4: si está en una llamada recursiva, siempre devuelve True, lo que en realidad no importa, pero no hace que el Assert falle. Si no está en una llamada recursiva, entonces devuelve "No bFlag", que bFlag ahora es "False" si IsRunningInIde fue llamado recursivamente, y bFlag es "Verdadero" si no se lo llama recursivamente. Así que básicamente, Not bFlag devuelve "True" si se está ejecutando en el IDE.

Línea 5: Borra el bFlag para que siempre sea "False" al comienzo de la próxima llamada a esta función.

Es difícil de explicar, es mejor recordarlo en ambos escenarios.

Si quiere un código más simple de entender, no lo use.

Si hay un problema con este código, me disculpo y házmelo saber para que pueda solucionarlo.

+0

Explique por qué funciona esto –

+0

Ok, actualicé con explicación. Me doy cuenta de que es una lógica confusa. –

1

Esa es mi función, similar a la de Josh, pero más fácil de leer (ver comentarios en el interior).

lo utilicé durante tanto tiempo que no recuerdo donde me prestó ...

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 
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 
Cuestiones relacionadas