2012-02-29 7 views
5

Я выполняю некоторые работы по техническому обслуживанию одного из наших старых приложений, написанного на Visual Basic 6, и по разным причинам у нас есть часть кода, который нужно выполнить только в том случае, если мы запускаем программу через VB6 IDE (т. е. отладчик подключен).Обнаружить, если отладчик подключен в VB6

В VB.NET вы можете сделать это, используя свойство System.Diagnostics.Debugger.IsAttached(), но я не могу найти ничего подобного в VB6 в Google.

Есть ли какой-нибудь простой способ понять эту информацию?

+0

Смотрите также вопрос [отладочный режим в VB6] (http://stackoverflow.com/questions/ 9052024/debug-mode-in-vb-6) – MarkJ

+0

Запуск в среде IDE не совпадает с подключением отладчика, что также можно сделать, конечно, но это совсем другое дело. – Bob77

ответ

7

Вот функция, я использую:

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

Это выглядит великолепно! Один вопрос. Если у нас есть другие операторы 'On Error GoTo' вне этой функции, мне нужно будет сбросить те, которые находятся вне этой функции? Или это обработчик ошибок внутри функции? – bhamby

+0

@galador Все ошибки, возникающие в этой функции, будут обрабатываться внутри этой функции, и вам не нужно будет перезагружать. –

+2

Эта функция сбрасывает объект «Err» в качестве побочного эффекта – wqw

9

Вот что мы используем, что не имеет каких-либо побочных эффектов

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

Без побочных эффектов плакат означает, что если вы включили «Break On All Errors», это не остановит выполнение программы, как это сделал принятый ответ от @Jay Riggs (что может быть очень неприятно, если вы используете InIde на всем протяжении место –

+0

@Kris: Это, а не сброс объекта 'Err' при использовании' On Error Resume Next' + 'Err.Number <> 0' стиль проверки ошибок. Btw никогда не видел, чтобы кто-то использовал что-либо, кроме' Break On Unhandled Ошибки' (если не быть невежественным из этих настроек IDE). – wqw

+0

@ Kris: Через два года после вашего первоначального комментария я убежден, что «Break On All Errors» - это путь к любому удаленному профессиональному проекту. Это стоило мне одной руки и нога для рефакторинга всех моих «кодов», но это того стоило. Спасибо за внимание! – wqw

2

я написал что-то вроде этого некоторое время назад и может» t найти его, и он нужен снова. Поэтому я только что написал это еще раз, и я думаю, что я правильно понял:

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 

Ошибка при поднятии.

Без сброса Err.

Только одна функция.

Строка 1: «Статическая» декларация «bFlag» заставляет значение bFlag придерживаться нескольких вызовов на «IsRunningInIde». Мы хотим этого, потому что я вызываю эту функцию внутри себя, и я не хочу замалчивать функцию входными параметрами, которые не нужны пользователю.

Строка 3: «Debug.Assert» не вызывается, когда не работает в среде IDE. Поэтому, только когда в среде IDE «IsrunningInIde» вызывается рекурсивно.

Строка 2: Если нет в рекурсивном вызове, bFlag начинается с false и получает значение true. Если в рекурсивном вызове (происходит только при запуске в среде IDE), он начинается с истины и возвращается к false.

Строка 3: Вызывается только «IsRunningInIde», если она не находится в этой функции рекурсивно, проверяя, является ли bFlag истинным.

Строка 4: Если в рекурсивном вызове всегда возвращается значение True, это не имеет особого значения, но не приводит к сбою Assert. Если нет в рекурсивном вызове, то возвращает «Not bFlag», который bFlag теперь «False», если IsRunningInIde был вызван рекурсивно, а bFlag «True», если он не рекурсивно называется. Так что в основном, Not bFlag возвращает «True», если он работает в среде IDE.

Строка 5: очищает bFlag так, что она всегда «False» в начале следующего вызова этой функции.

Трудно объяснить, что лучше пройти через это в своем уме в обоих сценариях.

Если вам нужен более простой способ понять код, не используйте его.

Если у вас возникли проблемы с этим кодом, прошу прощения и сообщите мне, чтобы я мог исправить это.

+0

Пожалуйста, объясните, почему это работает. –

+0

Хорошо, я обновил объяснение. Я понимаю, что это путаная логика. –

1

Это моя функция, аналогичная Джошу, но проще читать (см. Комментарии внутри).

Я использовал его так долго, что я забыл, где я позаимствовал из ...

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 
Смежные вопросы