2012-02-29 12 views
5

Wykonuję pewne prace konserwacyjne na jednej z naszych starych aplikacji napisanych w języku Visual Basic 6, i z różnych powodów mamy część kodu, która musi zostać uruchomiona tylko jeśli uruchamiamy program za pośrednictwem IDE VB6 (tj. dołączony jest debugger).Wykryj, czy Debugger jest dołączony do VB6

W VB.NET można to zrobić za pomocą właściwości System.Diagnostics.Debugger.IsAttached(), ale nie mogę znaleźć niczego podobnego w VB6 w Google.

Czy istnieje prosty sposób na wyodrębnienie tej informacji?

+0

Zobacz również kwestia [tryb debugowania w VB6] (http://stackoverflow.com/questions/ 9052024/debug-mode-in-vb-6) – MarkJ

+0

Uruchomienie w IDE to nie to samo co dołączenie debuggera, co oczywiście można zrobić oczywiście, ale to coś innego. – Bob77

Odpowiedz

7

Oto funkcja Używam:

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

To wygląda świetnie! Ale jedno pytanie. Jeśli mamy inne instrukcje 'On Error GoTo' poza tą funkcją, czy muszę zresetować te spoza tej funkcji? Lub czy obsługa błędów mieści się w obrębie funkcji? – bhamby

+0

@galador Wszystkie błędy wyrzucone w tej funkcji będą obsługiwane wewnątrz tej funkcji i nie będzie potrzeby resetowania. –

+2

Ta funkcja resetuje obiekt 'Err' jako efekt uboczny – wqw

9

Oto co używamy, że nie ma żadnych skutków ubocznych

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

Bez efektów ubocznych plakat oznacza, że ​​jeśli włączono opcję "Przerwij wszystkie błędy", nie spowoduje to zatrzymania wykonywania programu, jak przyjęta odpowiedź z @Jay Riggs (co może być bardzo irytujące, jeśli używasz InIde na całym świecie miejsce: –

+0

@Kris: To i nie resetowanie obiektu 'Err' jeśli używasz' On Error Resume Next' + 'Err.Number <> 0' stylu sprawdzania błędów Btw, nigdy nie widziałem nikogo używającego niczego oprócz' Break On Unhandled Błędy "(chyba że nie ma pojęcia o tych ustawieniach IDE) – wqw

+0

@Kris: Dwa lata po Twoim pierwszym komentarzu jestem przekonany, że" Break On All Errors "jest sposobem na każdy zdalnie profesjonalny projekt. Kosztowało mnie to jedną ręką i noga, która ma odmienić wszystkie moje "kody", ale było to warte, dziękuję za otwieracz! – wqw

2

napisałem coś takiego jakiś czas temu i może” t znaleźć i potrzebował tego ponownie. Więc po prostu napisał to jeszcze raz i myślę, że miał rację:

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 

Brak błędów coraz podniesiony.

Brak resetowania błędu.

Tylko jedna funkcja.

Wiersz 1: "Statyczna" deklaracja "bFlag" powoduje, że wartość bFlag polega na wielokrotnym wywołaniu "IsRunningInIde". Chcemy tego, ponieważ nazywam tę funkcję w sobie i nie chciałem zaśmiecać funkcji parametrami wejściowymi, które nie są potrzebne użytkownikowi.

Wiersz 3: "Debug.Assert" nie zostaje wywołany, gdy nie działa w środowisku IDE. Tak więc tylko w IDE "IsrunningInIde" jest wywoływany rekurencyjnie.

Wiersz 2: Jeśli nie w wywołaniu rekursywnym, bFlag rozpoczyna się od fałszu i otrzymuje wartość true. Jeśli w wywołaniu rekursywnym (dzieje się to tylko podczas działania w IDE), zaczyna się jako prawda i zostaje przywrócona wartość false.

Linia 3: wywoływać tylko "IsRunningInIde", jeśli nie jest jeszcze w tej funkcji rekurencyjnie, sprawdzając, czy bFlag ma wartość true.

Wiersz 4: Jeśli w wywołaniu rekurencyjnym, zawsze zwraca True, co nie ma znaczenia, ale nie powoduje niepowodzenia testu. Jeśli nie w wywołaniu rekursywnym, zwraca "Nie bFlag", który bFlag jest teraz "Fałsz", jeśli IsRunningInIde został nazwany rekursywnie, a bFlag jest "Prawdziwy", jeśli nie jest wywołany rekursywnie. Zasadniczo, nie bFlag zwraca "True", jeśli działa w IDE.

Linia 5: Czyści bFlag, aby zawsze był "fałszywy" na początku następnego połączenia z tą funkcją.

Trudno wytłumaczyć, lepiej jest przejść przez to w głowie, w obu scenariuszach.

Jeśli chcesz łatwiej zrozumieć kod, nie używaj go.

Jeśli wystąpi problem z tym kodem, przepraszam i daj mi znać, abym mógł to naprawić.

+0

Proszę wyjaśnić, dlaczego to działa –

+0

OK, zaktualizowałem wyjaśnienie, zdaję sobie sprawę, że jest to myląca logika. –

1

To jest moja funkcja, podobna do tej z Josha, ale łatwiejsza do odczytania (patrz komentarze wewnątrz).

użyłem go tak długo, że zapomniałem gdzie ja pożyczyłem od ...

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