Die Community zu .NET und Classic VB.
Menü

FAQ 0151: Läuft die Anwendung in der IDE oder als Kompilat?

 von 

Frage 

Wie finde ich heraus, ob die Anwendung in der IDE oder als Kompilat läuft?

Antwort  

Fehler auswerten

Eine mögliche Lösung ist das Reagieren auf einen Fehler: Debug.Print wird nicht mitkompiliert, somit auch nicht dessen Argumente. Fehlererzeugende Argumente fehlen also im Kompilat, somit kann man feststellen, ob die Anwendung als Kompilat läuft.

Function IsIDE () As Boolean
    On Error Goto Fehler

    '   Fehler produzieren
    Debug.Print 1/0

    '   Hier angekommen wurde kein Fehler gemeldet
    IsIDE = False

Ende:
    Exit Function

Fehler:
    '   Hier angekommen wurde ein Fehler gemeldet
    IsIDE =True

    Resume Ende
End Function

Listing 1: Auf einen Fehler reagieren

Beispiel von Dominic Hoffmann.

Rekursion auswerten

Debug.Assert wird ebenfalls nicht mitkompiliert, so daß man mittels Rekursion eine Prüfung realisieren kann.

Function IsCompiled( _
                Optional ByVal bVal As Boolean = False _
                ) As Boolean
    Static bComp__ As Boolean

    If bVal Then
        bComp__ = False
    Else
        bComp__ = True
        Debug.Assert Not IsCompiled(True)
        IsCompiled = bComp__
    End If
End Function

Listing 2: Rekursion auswerten

Call MsgBox("Kompiliert: " & CStr(IsCompiled()))

Listing 3: Beispiel eines Aufrufes

Beispiel von Konrad L. M. Rudolph.

Vorhandene Eigenschaften nutzen

Es geht aber auch viel profaner:

Function Iscompiled() As Boolean
    Iscompiled = Not App.LogMode
End Function

Listing 4: App.LogMode auswerten

Beispiel genannt von Klaus Langbein.

Eigene Steuerelemente  

Ernst wird die ganze Sache, sobald die Erkennung in einem eigenen Steuerelement stattfinden soll. Hier gibt es nämlich drei mögliche Zustände:

  • IDE Design: Der Code des Steuerelementes wird in der IDE zur Entwicklungszeit, also wenn man Steuerelemente auf die Form ziehen kann, ausgeführt.
  • IDE Running: Der Code des Steuerelementes wird in der IDE zur Laufzeit ausgeführt.
  • Kompilat: Der Code des Steuerelementes wird als Kompilat ausgeführt.
Const GW_OWNER As Long = &H4&

Enum CheckIDEEnum
    ciIDEDesign
    ciIDERun
    ciCompiled
End Enum

Declare Function GetClassName Lib "user32" _
                Alias "GetClassNameA" ( _
                ByVal hWnd As Long, _
                ByVal lpClassName As String, _
                ByVal nMaxCount As Long) As Long

Declare Function GetParent Lib "user32" ( _
        ByVal hwnd As Long) As Long

Declare Function GetWindow Lib "user32" ( _
                ByVal hWnd As Long, _
                ByVal wCmd As Long) As Long

Listing 5: notwendige Deklarationen

Function CheckIDE() As CheckIDEEnum
    Dim hwnd As Long
    Dim PhWnd As Long
    Dim Buffer As String
    Dim Result As Long

    hwnd = UserControl.hwnd
    Do While Not hwnd = 0
        PhWnd = hwnd
        hwnd = GetParent(PhWnd)
    Loop

    Buffer = Space$(128)
    PhWnd = GetWindow(PhWnd, GW_OWNER)
    Result = GetClassName(PhWnd, Buffer, Len(Buffer))
    If Left$(Buffer, 8) = "IDEOwner" Then
        'MsgBox "IDE"
        CheckIDE = CheckIDEEnum.ciIDEDesign
    ElseIf Left$(Buffer, 11) = "ThunderMain" Then
        'MsgBox "IDE running"
        CheckIDE = CheckIDEEnum.ciIDERun
    Else
        'MsgBox "compiled"
        CheckIDE = CheckIDEEnum.ciCompiled
    End If
End Function

Listing 6: Prüfung des Zustandes

Beispiel von idiv.

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.