2012-02-29 30 views
5

Tôi đang thực hiện một số công việc bảo trì trên một trong các ứng dụng cũ được viết trong Visual Basic 6 và vì nhiều lý do khác nhau, chúng tôi có một phần mã chỉ cần chạy nếu chúng tôi đang chạy chương trình thông qua IDE VB6 (tức là trình gỡ lỗi được đính kèm).Phát hiện nếu Trình gỡ lỗi được đính kèm trong VB6

Trong VB.NET, bạn có thể làm điều này bằng cách sử dụng thuộc tính System.Diagnostics.Debugger.IsAttached(), nhưng tôi không thể tìm thấy bất kỳ điều gì tương tự trong VB6 trên Google.

Có cách nào dễ dàng để tìm ra thông tin này không?

+0

Xem thêm các câu hỏi [chế độ gỡ lỗi trong vb6] (http://stackoverflow.com/questions/ 9052024/debug-mode-in-vb-6) – MarkJ

+0

Chạy trong IDE không giống như có một trình gỡ rối được đính kèm, mà cũng có thể được thực hiện tất nhiên nhưng đó là một điều khác. – Bob77

Trả lời

7

Dưới đây là một chức năng Tôi đã sử dụng:

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

Điều đó có vẻ tuyệt vời! Một câu hỏi, mặc dù. Nếu chúng ta có các câu lệnh 'On Error GoTo' khác bên ngoài hàm này, tôi có cần phải thiết lập lại những người bên ngoài hàm này không? Hay là trình xử lý lỗi có nằm trong hàm? – bhamby

+0

@galador Tất cả các lỗi được ném vào chức năng này sẽ được xử lý bên trong chức năng này và bạn sẽ không cần phải đặt lại. –

+2

Chức năng này đặt lại đối tượng 'Err' làm tác dụng phụ – wqw

9

Dưới đây là những gì chúng ta đang sử dụng mà không có bất kỳ tác dụng phụ

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

Không có tác dụng phụ nào áp phích có nghĩa là nếu bạn đã bật "Break On All Errors", điều này sẽ không ngừng thực hiện chương trình như câu trả lời được chấp nhận từ @Jay Riggs (có thể rất khó chịu nếu bạn sử dụng InIde trên tất cả –

+0

@Kris: Điều đó, và không đặt lại đối tượng 'Err' nếu sử dụng' On Error Resume Next' + 'Err.Number <> 0' kiểu kiểm tra lỗi. Btw, không bao giờ thấy bất cứ ai sử dụng bất cứ thứ gì ngoài' Break On Unhandled Lỗi 2 (trừ khi không có các thiết lập IDE này) – wqw

+0

@Kris: Hai năm sau bình luận ban đầu của bạn, tôi tin rằng "Break On All Errors" là cách để đi vào bất kỳ dự án chuyên nghiệp từ xa nào. một chân để refactor tất cả các "mã số" của tôi, nhưng nó đã được giá trị nó.Cảm ơn cho mắt mở! – wqw

2

tôi đã viết một cái gì đó như thế này một thời gian trở lại và có thể' t tìm thấy nó, và cần nó một lần nữa. Vì vậy, tôi chỉ viết lại và tôi nghĩ rằng tôi đã làm đúng:

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 

Không có lỗi nào được nêu ra.

Không đặt lại Err.

Chỉ một chức năng.

Dòng 1: Khai báo "tĩnh" của "bFlag" làm cho giá trị của bFlag dính vào nhiều cuộc gọi đến "IsRunningInIde". Chúng tôi muốn điều này bởi vì tôi gọi chức năng này trong chính nó, và tôi không muốn xả rác các chức năng với các thông số đầu vào mà không cần thiết bởi người sử dụng.

Dòng 3: "Debug.Assert" không được gọi khi không chạy trong IDE. Vì vậy, chỉ khi trong IDE không "IsrunningInIde" được gọi là đệ quy.

Dòng 2: Nếu không có trong cuộc gọi đệ quy, bFlag bắt đầu sai và được đặt thành true. Nếu trong cuộc gọi đệ quy (chỉ xảy ra khi chạy trong IDE), nó bắt đầu như là true, và được đặt trở lại false.

Dòng 3: Chỉ gọi "IsRunningInIde" nếu nó không có trong chức năng này đệ quy, bằng cách kiểm tra xem bFlag có đúng không.

Dòng 4: Nếu trong cuộc gọi đệ quy, luôn trả về True, không thực sự quan trọng, nhưng không khiến Assert thất bại. Nếu không có trong cuộc gọi đệ quy, sau đó trả về "Không bFlag", mà bFlag bây giờ là "Sai" nếu IsRunningInIde được gọi đệ quy, và bFlag là "Đúng" nếu không được gọi đệ quy. Về cơ bản, không bFlag trả về "True" nếu nó đang chạy trong IDE.

Dòng 5: Xóa bFlag sao cho luôn luôn "Sai" ở đầu cuộc gọi tiếp theo với hàm này.

Thật khó để giải thích, tốt hơn hết là bạn nên thực hiện nó trong đầu, trong cả hai trường hợp.

Nếu bạn muốn hiểu mã đơn giản hơn, đừng sử dụng nó.

Nếu có vấn đề với mã này, tôi xin lỗi và cho tôi biết để tôi có thể khắc phục.

+0

Xin giải thích lý do tại sao công trình này –

+0

Ok, tôi cập nhật với lời giải thích.Tôi nhận ra nó là logic khó hiểu. –

1

Đó là chức năng của tôi, tương tự như của Josh, nhưng đơn giản hơn để đọc (xem bình luận bên trong).

tôi đã sử dụng nó rất lâu đến nỗi tôi quên nơi tôi mượn từ ...

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 
Các vấn đề liên quan