Определить, подключен ли отладчик в VB6 - PullRequest
6 голосов
/ 01 марта 2012

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

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

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

Ответы [ 5 ]

11 голосов
/ 01 марта 2012

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

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
7 голосов
/ 01 марта 2012

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

Private Function RunningInIde() As Boolean
    On Error GoTo ErrHandler
    Debug.Print 1 / 0
ErrHandler:
    RunningInIde = (Err.Number <> 0)
End Function            ' RunningInIde
2 голосов
/ 26 декабря 2012

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

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: «Debug.Assert» не вызывается, когда не работает в IDE. Таким образом, только когда в IDE IsrunningInIde вызывается рекурсивно.

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

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

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

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

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

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

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

1 голос
/ 25 ноября 2013

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

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

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 голосов
/ 28 июня 2017
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...