2012-02-29 11 views
5

में डीबगर संलग्न है या नहीं, मैं विजुअल बेसिक 6 में लिखे गए हमारे पुराने अनुप्रयोगों में से एक पर कुछ रखरखाव कार्य कर रहा हूं, और विभिन्न कारणों से, हमारे पास कोड का एक हिस्सा है जिसे केवल चलाने की आवश्यकता है हम वीबी 6 आईडीई के माध्यम से कार्यक्रम चला रहे हैं (यानी, डीबगर संलग्न है)।पता लगाएं कि वीबी 6

वीबीएनईटी में, आप System.Diagnostics.Debugger.IsAttached() संपत्ति का उपयोग कर ऐसा कर सकते हैं, लेकिन मुझे Google पर वीबी 6 में कुछ भी नहीं मिल रहा है।

क्या इस जानकारी को समझने का कोई आसान तरीका है?

+0

भी देखें प्रश्न [VB6 में डिबग मोड] (http://stackoverflow.com/questions/ 9052024/डीबग-मोड-इन-वीबी -6) – MarkJ

+0

आईडीई में चलना डीबगर संलग्न होने जैसा नहीं है, जो निश्चित रूप से भी किया जा सकता है लेकिन यह एक अलग बात है। – Bob77

उत्तर

7

यहाँ एक समारोह मैं उपयोग करते आ रहे:

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

यह बहुत अच्छा लग रहा है! एक प्रश्न, यद्यपि। अगर हमारे पास इस फ़ंक्शन के बाहर अन्य 'ऑन त्रुटि त्रुटि' कथन हैं, तो क्या मुझे इस फ़ंक्शन के बाहर उनको रीसेट करने की आवश्यकता होगी? या फ़ंक्शन के अंदर त्रुटि वाले हैंडलर हैं? – bhamby

+0

@galador इस फ़ंक्शन में फेंक दी गई सभी त्रुटियों को इस फ़ंक्शन के अंदर संभाला जाएगा और आपको रीसेट करने की आवश्यकता नहीं होगी। –

+2

यह फ़ंक्शन 'एरर' ऑब्जेक्ट को साइड इफेक्ट के रूप में रीसेट करता है – 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

किसी भी दुष्प्रभाव से पोस्टर का अर्थ यह नहीं है कि यदि आपके पास "सभी त्रुटियों को तोड़ना" चालू है, तो यह प्रोग्राम के निष्पादन को रोक नहीं देगा जैसे कि @ जे रिग्स से स्वीकृत उत्तर (जो कि आप इनइइड का उपयोग करते हुए बहुत परेशान हो सकते हैं जगह। –

+0

@ क्रिस: वह, 'त्रुटि पर फिर से शुरू करें' + 'त्रुटि' की जांच करने के लिए 'एरर' ऑब्जेक्ट का उपयोग करते हुए 'एरर' ऑब्जेक्ट को रीसेट नहीं कर रहा है। बीटीडब्ल्यू, किसी ने भी कुछ भी इस्तेमाल नहीं देखा लेकिन 'अनचाहे तोड़ना त्रुटियां '(इन आईडीई सेटिंग्स की अनजान होने तक) – wqw

+0

@ क्रिस: आपकी मूल टिप्पणी के दो साल बाद मुझे आश्वस्त है कि "सभी त्रुटियों को तोड़ना" किसी भी दूरस्थ पेशेवर परियोजना पर जाने का तरीका है। यह मुझे एक हाथ और मेरे सभी "कोड" को दोबारा करने के लिए एक पैर लेकिन यह इसके लायक था। आंख खोलने वाले के लिए धन्यवाद! – wqw

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: "बीएफएलएजी" की "स्टेटिक" घोषणा का कारण बीएफएलएग के मूल्य को "IsRunningInIde" में एकाधिक कॉलों में चिपकने का कारण बनता है। हम इसे इसलिए चाहते हैं क्योंकि मैं इस फ़ंक्शन को अपने आप में कॉल करता हूं, और मैं उस इनपुट पैरामीटर के साथ फ़ंक्शन को कूड़ा नहीं करना चाहता था जिसे उपयोगकर्ता द्वारा आवश्यक नहीं है।

रेखा 3: आईडीई में नहीं चलते समय "डीबग.एस्र्ट" को कॉल नहीं किया जाता है। तो केवल जब आईडीई में "IsrunningInIde" को रिकर्सिवली कहा जाता है।

रेखा 2: यदि रिकर्सिव कॉल में नहीं है, तो बीएफएलएजी गलत शुरू होता है, और सत्य पर सेट हो जाता है। यदि रिकर्सिव कॉल में (केवल आईडीई में चलते समय होता है), यह सत्य के रूप में शुरू होता है, और वापस झूठ पर सेट हो जाता है।

रेखा 3: केवल "IsRunningInIde" को कॉल करें यदि यह पहले से ही इस फ़ंक्शन में पहले से नहीं है, तो यह जांचकर कि बीएफएलएजी सच है या नहीं।

रेखा 4: यदि रिकर्सिव कॉल में, हमेशा सत्य लौटाता है, जो वास्तव में कोई फर्क नहीं पड़ता है, लेकिन असर विफल होने का कारण नहीं बनता है। यदि रिकर्सिव कॉल में नहीं है, तो "बीएफएलएजी नहीं" लौटाता है, जो बीएफएलएग अब "गलत" है यदि IsRunningInIde को रिकर्सिवली कहा जाता है, और बीएफएलएग "ट्रू" है जिसे रिकर्सिवली कहा जाता है। तो मूल रूप से, यदि बीएफएलएजी आईडीई में चल रहा है तो "ट्रू" नहीं लौटाता है।

रेखा 5: बीएफएलएजी को साफ़ करता है ताकि यह इस फ़ंक्शन के लिए अगली कॉल की शुरुआत में हमेशा "गलत" हो।

यह समझाना मुश्किल है, दोनों परिदृश्यों में, आपके दिमाग में इसे आगे बढ़ाना बेहतर है।

यदि आप कोड को समझना आसान चाहते हैं, तो इसका उपयोग न करें।

यदि इस कोड में कोई समस्या है, तो मैं क्षमा चाहता हूं और मुझे बताता हूं ताकि मैं इसे ठीक कर सकूं।

+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